代码展示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)对象的命名空间实例化一个对象,就会自动创建一个该对象的命名空间,在该命名空间中存放对象的属性;同时 , 在实例化之后,就后产生一个指向类对象指针,用来指向当前对象所属类的命名空间,这样就可以访问类的静态属性与动态属性 。
在对象寻找属性的过程中,优先从对象的命名空间中搜索,然后去类的命名空间中查找 , 最后在父类的命名空间中查找... , 若没有找到该属性,程序就会抛出异常 。
注:类与对象的命名空间是独立存储的
文章插图
完整代码展示:
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>}"""
推荐阅读
- 军棋这个游戏怎么玩(军棋属于什么游戏)
- 一加手机到底怎么样(国产一加属于什么档次)
- OpenDataV低代码平台增加自定义属性编辑
- 我公司是属于生产制造业,最近考虑实施ERP,生产制造业的ERP那家比较好?
- 瑞道锆业资讯 瑞道金属网今日锆产业
- 根据不同时辰看生肖属鼠的财运,属鼠的你必看
- 属羊人未来5年的运势 要时刻注意事业运势情况
- 92年属猴人注定的婚姻解析,要注意什么
- 95年属猪运气在2023年是怎么样的 人生三大方面剖析
- 98年属虎女事业发展如何 赶紧来看看她们的情况