class AClassWithoutID:
def __init__(self):
self.name = 'XinChunKuaiLe'
class SomeClass:
def __init__(self, AClassWithoutID_instance):
self.thing = AClassWithoutID_instance
self.thing.id = 123456
WithoutID = AClassWithoutID()
print WithoutID.id # 运行结果显示 have no attribute 'id'
temp = SomeClass(WithoutID)
print WithoutID.id # 打印出 123456
新手初涉面向对象的编程,为什么可以使AClassWithoutID实例 增加一个成员id?感觉有点装饰器的相似感。。
查了一下资料发现python是动态语言,那么是因为python是动态语言所以有这个特性的吗? 如果可以随意改变实例,那不是算是破环了封装性吗?
求大神指点
没错,就是因为 python 是动态语言
python 的实例成员确实是可以随意添加,但这并不影响业务逻辑的实现。别人在你身上挂一百个无用属性又如何?只要保护好你在乎的,你会用到的即可。对于确实想私有化的属性,请加前导双下划线。
更何况, OOP 的封装性只是一种思想,它指出类中不同的成员,应有不同的访问控制。
许多语言认为应该将封装性加入语言特性,如 java。它们将会对不合理的访问抛出错误。
但 Guido 不这么认为。一方面,python 是一门多范式的语言,不应有太多 OOP 特性;另一方面,也没有必要。不恰当的访问其实也不会怎么样,反而一个较松的语言定义可以让程序员们时刻保持警惕: 做自己该做的事,不要作死。
于是,这个特性没有了——正所谓大道至简。