更明确地说:在这个例子中,“再见”和“再见”之间有什么区别吗?一个比另一个有什么优势吗?
class Hello(object):
def hi(self):
pass
class Goodbye(object):
def __init__(self):
self.hello = Hello()
class Farewell(object):
hello = Hello()
是的。Goodbye
类和Farewell
类的区别在于Goodbye
有一个实例成员 hello
,而Farewell
类有一个类成员 hello
。如果更改Hello
属于某个Farewell
对象的类,则所有实例都会Farewell
看到更改,因此您可以这样做:
a = Goodbye()
b = Goodbye()
a.hello.member = 1 # monkey-patching the member
b.hello.member = 2
print(a.hello.member) # prints "1"
print(b.hello.member) # prints "2"
f = Farewell()
g = Farewell()
f.hello.member = 1
g.hello.member = 2
print(f.hello.member) # prints "2"!
这样做的原因是因为,正如您定义的那样,Goodbye
类的实例有自己的Hello
对象实例,而Farewell
类的所有实例共享同一个Hello
对象。查看文档以了解更多信息!
现在,一个与另一个相比是否具有任何优势取决于实现。类成员有时会让用户感到困惑,因为他们可能希望类的不同实例独立于其他操作保留自己的状态(即,可变类成员可能会破坏封装)。但是,从效率的角度来看,定义可能很有用在所有类中保持不变的成员(确保以某种方式向用户说明这一点,例如将它们隐藏在下划线前缀或清晰的文档后面)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句