在 __init__ 内部或外部的类中实例化一个类有什么区别?

超人2

更明确地说:在这个例子中,“再见”和“再见”之间有什么区别吗?一个比另一个有什么优势吗?

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章