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
?? ..
任何有用的帮助都会受到赞赏。谢谢
答案 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
尚不存在。