定制对象独有特征

定制对象独有特征

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

一、引入

class Student:
    school = 'hnnu'

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


stu1 = Student()
stu2 = Student()
stu3 = Student()

  • 对于上述的学生类,如果类的属性(school)改了,则其他对象的属性也会随之改变
# 给stu1添加了属性school和类中的属性school是不同的
stu1.school = 'fudan'
print(stu1.school)

print(stu2.school)

fudan
hnnu

二、定制对象独有特征

84-定制对象独有特征-2样币.jpg?x-oss-process=style/watermark

# 查看他们的属性和方法
print(stu1.__dict__)
print(stu2.__dict__)

{}

{}

  • 对象本质类似于类,也是一个名称空间,但是对象的名称空间存放对象独有的名字,而类中存放的是对象们共有的名字。因此我们可以直接为对象单独定制名字。

stu1.name = 'laowang'
stu1.age = 18
stu1.gender = 'male'

print(stu1.name, stu1.age, stu1.gender)

laowang 18 male

try:
    print(stu2.name, stu2.age, stu2.gender)
except Exception as e:
    print(e)

'Student' object has no attribute 'name'

stu2.name = 'xulou'
stu2.age = 19
stu2.gender = 'female'

print(stu2.name, stu2.age, stu2.gender)

xulou 19 female

三、属性查找

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

四、类定义阶段定制属性

def init(obj, x, y, z):
    obj.name = x
    obj.age = y
    obj.gender = z
    
init(stu1, 'laowang', 18, 'male1')
print(stu1.name, stu1.age, stu1.gender)

laowang 18 male1

init(stu2, 'xulou', 19, 'female1')
print(stu2.name, stu2.age, stu2.gender)

xulou19 female1

  • 使用上述方法虽然让我们定制属性更简单,但是还是太麻烦了,如果可以在实例化对象的时候自动触发定时属性,那就更方便了,因此可以使用类的__init__方法。

84-定制对象独有特征-2复杂.jpg?x-oss-process=style/watermark

class Student2:
    school = 'hnnu'
	
    # 对象绑定方法
    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:
    
    # 会报错,则需要在调用类的时候添加参数
    stu2 = Student2()

except Exception as e:
    print(e)

__init__() missing 3 required positional arguments: 'name', 'age', and 'gender'`

stu2 = Student2('randy', 16, 'malee')


通过上述现象可以发现,调用类时发生两件事:

  1. 创造一个空对象
  2. 自动触发类中__init__功能的执行,将stu2以及调用类括号内的参数一同传入
print(stu2.__dict__)

{'name': 'randy', 'age': 16, 'gender': 'malee'}

注:

__init__:

  1. 该方法是在产生对象之后才调用

  2. 该方法内可以有任意python代码,但唯独就是不能有返回值

  3. 绑定方法
    类中定义的函数是类的函数属性,就是一个普通函数,没有自动传参的效果
    但类中定义的函数其实是绑定给对象用的,称之为绑定方法,绑定方法的特殊之处
    绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个位置参数自动传入

posted @ 2019-08-26 19:39  RandySun  阅读(239)  评论(0编辑  收藏  举报