不能理解点运算符的概念

发布于 2021-01-29 15:12:15

嗨,大家真的对点运算符的工作感到困惑。我尝试过的代码

class Name:
    class x:
        def __init__(self,y):
            self.y = y
    def __init__(self):
        pass

some = Name()
some.x.y = 'foo'
print some.x.y

当我运行此代码时,它会成功输出foo

但是当我尝试代码时

class Name:
    class x:
        def __init__(self,y,z):
            self.y = y
            self.z = z
    def __init__(self):
        pass

some = Name()
some.x.y.z = 'foo'
print some.x.y.z

我收到一个错误..我该如何使用likesome.x.y.z并将输出作为foo?? ..

任何有用的帮助,将不胜感激..谢谢

关注者
0
被浏览
50
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    目前尚不清楚为什么您期望第二个代码能工作。第一个代码是不好的,因为它混淆了类和实例:some是一个 实例 中的 Name;
    some.x是一 ,也是一 类属性Name。如果您创建另一个Name实例,它将在上共享相同的属性x。而是考虑一下:

    class Name(object):
        def __init__(self, x=None,
                     y=None, z=None):
            self.x = x
            self.y = y
            self.z = z
    
    y = Name(z='foo')
    x = Name(y=y)
    some = Name(x=x)
    
    ##some = Name(x=Name(y=Name(z='foo'))) # one-line equivalent
    
    print some.x.y.z # 'foo'
    

    结果看起来像:

     - some: Name
       - x: Name
         - x: None
         - y: Name
           - x: None
           - y: None
           - z: 'foo'
         - z: None
       - y: None
       - z: None
    

    您不能尝试访问任意属性链a.b.c.d并期望它们起作用。您必须定义对象应该具有的属性(直到进入eg
    __getattr__,但现在就不用担心了)。尽管可以向自己的类(因此可以None设置some.x.y.z.foo = 'bar'),但是不能将任意属性添加到例如或的字符串中(因此现在不能设置some.x.y.bar = 'baz')。但是您不能执行例如some.x.y.foo.bar = 'baz',因为some.x.y.foo还不存在。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看