Justin-刘清政的博客

python/面向对象基础/4-定制对象独有特征

2020-12-21

类中定义的函数是类的函数属性,类可以使用,但使用的就是一个普通的函数而已,意味着需要完全遵循函数的参数规则,该传几个值就传几个

一、引入

1
2
3
4
5
6
7
8
9
10
class OldboyStudent:
school = 'oldboy'

def choose_course(self):
print('is choosing course')


stu1 = OldboyStudent()
stu2 = OldboyStudent()
stu3 = OldboyStudent()
  • 对于上述的学生类,如果类的属性改了,则其他对象的属性也会随之改变
1
OldboyStudent.school = 'OLDBOY'
1
print(stu1.school)
1
OLDBOY
1
print(stu2.school)
1
OLDBOY

二、定制对象独有特征

[84-定制对象独有特征-2样币.jpg

1
print(stu1.__dict__)
1
{}
1
print(stu2.__dict__)
1
{}
  • 对象本质类似于类,也是一个名称空间,但是对象的名称空间存放对象独有的名字,而类中存放的是对象们共有的名字。因此我们可以直接为对象单独定制名字。
1
2
3
4
5
stu1.name = 'tank'
stu1.age = 18
stu1.gender = 'male'

print(stu1.name, stu1.age, stu1.gender)
1
tank 18 male
1
2
3
4
try:
print(stu2.name, stu2.age, stu2.gender)
except Exception as e:
print(e)
1
'OldboyStudent' object has no attribute 'name'
1
2
3
4
5
stu2.name = 'sean'
stu2.age = 19
stu2.gender = 'female'

print(stu2.name, stu2.age, stu2.gender)
1
sean 19 female

三、属性查找

  • 首先从自身查找,没找到往类中找,类中没有则会报错。即对象的属性查找顺序为:自身–》类–》报错

四、类定义阶段定制属性

1
2
3
4
5
6
7
8
def init(obj, x, y, z):
obj.name = x
obj.age = y
obj.gender = z


init(stu1, 'tank1', 181, 'male1')
print(stu1.name, stu1.age, stu1.gender)
1
tank1 181 male1
1
2
init(stu2, 'sean1', 191, 'female1')
print(stu2.name, stu2.age, stu2.gender)
1
sean1 191 female1
  • 使用上述方法虽然让我们定制属性更简单,但是还是太麻烦了,如果可以在实例化对象的时候自动触发定时属性,那就更方便了,因此可以使用类的init方法。

[84-定制对象独有特征-2复杂.jpg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class OldboyStudent:
school = 'oldboy'

def __init__(self, name, age, gender):
"""调用类的时候自动触发"""
self.name = name
self.age = age
self.gender = gender
print('*' * 50)

def choose_course(self):
print('is choosing course')


try:
stu1 = OldboyStudent()
except Exception as e:
print(e)
1
__init__() missing 3 required positional arguments: 'name', 'age', and 'gender'
1
stu1 = OldboyStudent('lqz', 18, 'male')
1
**************************************************
  • 通过上述现象可以发现,调用类时发生两件事:
    1. 创造一个空对象
    2. 自动触发类中init功能的执行,将stu1以及调用类括号内的参数一同传入
1
print(stu1.__dict__)
1
{'name': 'lqz', 'age': 18, 'gender': 'male'}
使用支付宝打赏
使用微信打赏

点击上方按钮,请我喝杯咖啡!

扫描二维码,分享此文章