Python定制对象的独有特征

打印 上一主题 下一主题

主题 676|帖子 676|积分 2028

一、引入
  1. class OldboyStudent:
  2.     school = 'oldboy'
  3.     def choose_course(self):
  4.         print('is choosing course')
  5. stu1 = OldboyStudent()
  6. stu2 = OldboyStudent()
  7. stu3 = OldboyStudent()
复制代码
对于上述的学生类,如果类的属性改了,则其他对象的属性也会随之改变
  1. ldboyStudent.school = 'OLDBOY'
  2. print(stu1.school)
  3. OLDBOY
  4. print(stu2.school)
  5. OLDBOY
复制代码
二、定制对象独有特征
  1. print(stu1.__dict__)
  2. {}
  3. print(stu2.__dict__)
  4. {}
复制代码
对象本质类似于类,也是一个名称空间,但是对象的名称空间存放对象独有的名字,而类中存放的是对象们共有的名字。因此我们可以直接为对象单独定制名字。
  1. stu1.name = 'tank'
  2. stu1.age = 18
  3. stu1.gender = 'male'
  4. print(stu1.name, stu1.age, stu1.gender)
  5. tank 18 male
  6. try:
  7.     print(stu2.name, stu2.age, stu2.gender)
  8. except Exception as e:
  9.     print(e)
  10. 'OldboyStudent' object has no attribute 'name'
  11. stu2.name = 'sean'
  12. stu2.age = 19
  13. stu2.gender = 'female'
  14. print(stu2.name, stu2.age, stu2.gender)
  15. sean 19 female
复制代码
三、属性查找

首先从自身查找,没找到往类中找,类中没有则会报错。即对象的属性查找顺序为:自身--》类--》报错
四、类定义阶段定制属性
  1. def init(obj, x, y, z):
  2.     obj.name = x
  3.     obj.age = y
  4.     obj.gender = z
  5. init(stu1, 'tank1', 181, 'male1')
  6. print(stu1.name, stu1.age, stu1.gender)
  7. tank1 181 male1
  8. init(stu2, 'sean1', 191, 'female1')
  9. print(stu2.name, stu2.age, stu2.gender)
  10. sean1 191 female1
复制代码
使用上述方法虽然让我们定制属性更简单,但是还是太麻烦了,如果可以在实例化对象的时候自动触发定时属性,那就更方便了,因此可以使用类的__init__方法。
  1. class OldboyStudent:
  2.     school = 'oldboy'
  3.     def __init__(self, name, age, gender):
  4.         """调用类的时候自动触发"""
  5.         self.name = name
  6.         self.age = age
  7.         self.gender = gender
  8.         print('*' * 50)
  9.     def choose_course(self):
  10.         print('is choosing course')
  11. try:
  12.     stu1 = OldboyStudent()
  13. except Exception as e:
  14.     print(e)
  15.    
  16. #学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
  17. __init__() missing 3 required positional arguments: 'name', 'age', and 'gender'
  18. stu1 = OldboyStudent('nick', 18, 'male')
  19. **************************************************
复制代码
通过上述现象可以发现,调用类时发生两件事:
创造一个空对象
自动触发类中__init__功能的执行,将stu1以及调用类括号内的参数一同传入
  1. print(stu1.__dict__)
  2. {'name': 'nick', 'age': 18, 'gender': 'male'}
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户云卷云舒

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表