1.类、属性、方法的定义
# 类定义
class Person:
# 定义基本属性
name = ''
age = 0
height = 1.0
sex = '不详'
birth = ''
# 受保护的,子类无法继承
_special = ()
# 定义私有属性
__weight = 0
# 构造方法
def __init__(self,name,age,height,sex,birth,weight):
self.name = name
self.age = age
self.height = height
self.sex = sex
self.birth = birth
self.__weight = weight
# 类的方法
def __repr__(self):
return "{ name:%s,age:%d,height:%.2f,sex:%s,birth:%s,weight:%.2f }"\
%(self.name,self.age,self.height,self.sex,self.birth,self.__weight)
person = Person('CaiBird',22,1.80,'男','1994.10.13',123)
print(repr(person))
2.类的专有方法
# __init__ : 构造函数,在生成对象时调用
# __del__ : 析构函数,释放对象时使用
# __repr__ : 打印,转换
# __setitem__ : 按照索引赋值
# __getitem__ : 按照索引获取值
# __len__ : 获得长度
# __cmp__ : 比较运算
# __call__ : 函数调用
# __add__ : 加运算
# __sub__ : 减运算
# __mul__ : 乘运算
# __div__ : 除运算
# __mod__ : 求余运算
# __pow__ : 乘方
3.继承
# 继承
class Student(Person) :
# 定义自己的属性
studentNo = 0
# 构造方法
def __init__(self,studentNo,name,age,height,sex,birth,weight):
Person.__init__(self,name,age,height,sex,birth,weight)
self.studentNo = studentNo
# 重写父类方法
def __repr__(self):
# return Person.personMessage(self).replace(' }',',studentNo:%s }'%(self.studentNo))
return Person.__repr__(self)[:-2] + ',studentNo:%s }'%(self.studentNo)
stu = Student('1234567890','CaiBird',22,1.80,'男','1994.10.13',123)
print(repr(stu))
4.多重继承
# 多重继承
class CoderMonkey(Person):
skill = ''
def __init__(self,name,age,height,sex,birth,weight,skill):
# super(CoderMonkey,self).__init__(name, age, height, sex, birth, weight)
Person.__init__(self, name, age, height, sex, birth, weight)
self.skill = skill
# 加班方法
def workOverTime(self):
return '我叫%s,我是个程序员,我会加班!'%(self.name)
class SingleDog(Person):
food = ''
def __init__(self,name,age,height,sex,birth,weight,food):
# super(SingleDog,self).__init__(name, age, height, sex, birth, weight)
Person.__init__(self, name, age, height, sex, birth, weight)
self.food = food
# 受虐方法
def abused(self):
return '我叫%s,我是个单身狗,天天被虐!'%(self.name)
class Me(CoderMonkey,SingleDog):
identifier = 'Hello Python'
def __init__(self,name,age,height,sex,birth,weight,skill,food):
# 思考:使用super()和父类类名的区别、联系
Person.__init__(self,name, age, height, sex, birth, weight)
self.skill = skill
self.food = food
# 重写父类方法
def __repr__(self):
# return Person.personMessage(self).replace(' }',',studentNo:%s }'%(self.studentNo))
return Person.__repr__(self)[:-2] + ',skill:%s,food:%s }' % (self.skill,self.food)
# 方法名相同,先调用括号排在前面的父类方法
me = Me('CaiBird',22,1.80,'男','1994.10.13',123,'狗粮','加班')
print('Me:%s'%(repr(me)))
print(me.workOverTime())
print(me.abused())
5.super()和父类类名
①、 super并不是一个函数,是一个类名,形如super(B, self)事实上调用了super类的初始化函数,
产生了一个super对象
②、Python的多继承类是通过mro的方式来保证各个父类的函数被逐一调用,而且保证每个父类函数
只调用一次(如果每个类都使用super)
③、混用super类和非绑定的函数是一个危险行为,这可能导致应该调用的父类函数没有调用或者一
个父类函数被调用多次