静态属性的陷阱 python中类与对象的命名空间、__dict__ 和 dir 在继承中使用说明( 二 )

代码展示2

22 # 通过对象名修改属性(若self里 存在该属性,是修改;若self里 不存在该属性,是添加新属性)23 # rec_obj1.length = 2024 # rec_obj1.temVar = 'object_over'  # 给对象中添加一个新属性 'temVar': 'object_over'25 # 通过类名修改属性(若类里 存在该属性<静态属性>,是修改;若类里 不存在该属性,是添加新属性,<静态属性>)26 # Rectangle.length = 50   # 在类中添加一个新属性 'length': 5027 # Rectangle.temVar = 'class_over'
总结:
# 对象 = 类名()
# 实例化的过程:
【静态属性的陷阱 python中类与对象的命名空间、__dict__ 和 dir 在继承中使用说明】# 类名() -> 会创造出一个对象,即创建了一个self变量
# 调用__init__(self)方法,类名括号里的参数会被这里接收
# 执行__init__(self)方法
# 返回self
# 对象能做的事:
# 查看属性(自己的属性 和 类中静态属性)
# 调用方法
# __dict__ 对于对象的增删改查操作都可以通过字典的语法进行
# 类名能做的事:
# 实例化
 # 调用类中的属性 , 也就是调用静态属性
# 调用方法 : 只不过要自己传递self参数
# __dict__ 对于类中的名字只能看 不能操作
2. 类与对象的关系(类与对象的命名空间问题)(1)类的命名空间创建一个类,就会自动创建一个该类的命名空间,在该命名空间中存储类的属性(静态属性、动态属性(方法));
静态属性:直接在类中定义的变量;(静态属性属于类,即属于所有对象)
动态属性:在类中定义的函数;(动态属性绑定到所有对象)
(2)对象的命名空间实例化一个对象,就会自动创建一个该对象的命名空间,在该命名空间中存放对象的属性;同时 , 在实例化之后,就后产生一个指向类对象指针,用来指向当前对象所属类的命名空间,这样就可以访问类的静态属性与动态属性 。
在对象寻找属性的过程中,优先从对象的命名空间中搜索,然后去类的命名空间中查找 , 最后在父类的命名空间中查找... , 若没有找到该属性,程序就会抛出异常 。
注:类与对象的命名空间是独立存储的
静态属性的陷阱 python中类与对象的命名空间、__dict__ 和 dir 在继承中使用说明

文章插图
 完整代码展示:
class Family:    '''    定义一个公共账号 ,只要有人上班,就将钱存到这个账号上    '''    share_money = 0  # 不可变数据类型做静态属性    native_place = ['china']    # 可变数据类型做静态属性    def __init__(self, role, name, salary):        self.role = role        self.name = name        self.salary = salary    def work(self):        Family.share_money += self.salary   # 将每个的钱都存放到这个公共账号上        print('the account remains ¥%s '%Family.share_money)member1 = Family('father', 'lilei', 1000)member2 = Family('mother', 'zhanghua', 500)member1.work()  # the account remains ¥1000member2.work()  # the account remains ¥1500member1.share_money = 200   # 为自己独立开了个小金库,并存入200元   -- 在对象member1中添加这一属性member1.share_money += 100  # 以后就可以在自己的小金库中存放私房钱,即总金额=200+100=300member2.share_money += 400  # 将公有账号作为自己的私有账号,并存入400元 , 即总金额=1000+500+400=1900print(Family.share_money)   # 1000+500=1500print(member1.share_money)  # 200+100=300print(member2.share_money)  # 1000+500+400=1900"""可变数据类型做静态属性的影响:Family.native_place = 'america'# member1.native_place[0] = 'america' # 修改的是类中的native_place,会影响所有对象(同上)# member2.native_place[0] = 'america' # 修改的是类中的native_place,会影响所有对象(同上)print(member1.__dict__)print(member2.__dict__)print(Family.__dict__){'role': 'father', 'name': 'lilei', 'salary': 1000, 'share_money': 300}{'role': 'mother', 'name': 'zhanghua', 'salary': 500, 'share_money': 1900}{'__module__': '__main__', '__doc__': '\n    定义一个公共账号 ,只要有人上班 , 就将钱存到这个账号上\n    ','share_money': 1500, 'native_place': ['america'], '__init__': <function Family.__init__ at 0x0000021C360084C8>,'work': <function Family.work at 0x0000021C3629C048>, '__dict__': <attribute '__dict__' of 'Family' objects>,'__weakref__': <attribute '__weakref__' of 'Family' objects>}""""""可变数据类型做静态属性的影响:member1.native_place = 'america'    # 重新赋值 , 在当前对象的命名空间中添加这个属性,不会影响其它对象print(member1.__dict__)print(member2.__dict__)print(Family.__dict__){'role': 'father', 'name': 'lilei', 'salary': 1000, 'share_money': 300, 'native_place': 'america'}{'role': 'mother', 'name': 'zhanghua', 'salary': 500, 'share_money': 1900}{'__module__': '__main__', '__doc__': '\n    定义一个公共账号 ,只要有人上班,就将钱存到这个账号上\n    ','share_money': 1500, 'native_place': ['china'], '__init__': <function Family.__init__ at 0x000002E4747684C8>,'work': <function Family.work at 0x000002E4749FC048>, '__dict__': <attribute '__dict__' of 'Family' objects>,'__weakref__': <attribute '__weakref__' of 'Family' objects>}"""

推荐阅读