无法理解点运算符概念

时间:2014-07-18 07:44:30

标签: python

嘿,伙计们对点操作员的工作感到很困惑。我试过的代码......

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

我收到错误..我可以像some.x.y.z一样使用并输出foo ?? ..

任何有用的帮助都会受到赞赏。谢谢

1 个答案:

答案 0 :(得分:3)

目前尚不清楚为什么您希望第二个代码能够正常工作。第一个代码很糟糕,因为它混合了类和实例: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的任意链并期望它们起作用;您必须定义对象应具有的属性(直到您进入__getattr__,但现在不要担心)。您无法将任意属性添加到例如字符串或None(因此您现在无法设置some.x.y.z.foo = 'bar'),尽管您可以使用自己的类(因此您可以设置some.x.y.bar = 'baz')。但是,你无法做到,例如some.x.y.foo.bar = 'baz',因为some.x.y.foo尚不存在。