首页 > 关于python动态增加类成员的问题?

关于python动态增加类成员的问题?

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有变量隐藏 用双下划线开头命名可以隐藏掉不想对外开放的变量,方法。
类加入__slots__ = ('name', 'gender') 可以达到只能访问和增加元祖内的名称。
你也可以重写 setattr 保护你自己的变量即可


没错,就是因为 python 是动态语言

python 的实例成员确实是可以随意添加,但这并不影响业务逻辑的实现。别人在你身上挂一百个无用属性又如何?只要保护好你在乎的,你会用到的即可。对于确实想私有化的属性,请加前导双下划线。

更何况, OOP 的封装性只是一种思想,它指出类中不同的成员,应有不同的访问控制

许多语言认为应该将封装性加入语言特性,如 java。它们将会对不合理的访问抛出错误。

但 Guido 不这么认为。一方面,python 是一门多范式的语言,不应有太多 OOP 特性;另一方面,也没有必要。不恰当的访问其实也不会怎么样,反而一个较松的语言定义可以让程序员们时刻保持警惕: 做自己该做的事,不要作死。

于是,这个特性没有了——正所谓大道至简。

【热门文章】
【热门文章】