目录
2.super().__init__()表示直接调用父类的__init__(self......参数)函数
知识点1.内置方法
一.定义
在类里面,__开头__结尾的方法
1.__init__
class student:
def __init__(self,newname):
self.name=newname
def __str__(self):
return f'{self.name}'
r=student('xiaoming')
print(r)
2.__str__
- 运行小规则:遇到print或者format输出对象时自动调用__str__方法
- 必须返回字符串
- 如果返回其中有元素非字符串,使用str转化为字符串
- 且在str内置方法中只有self一个属性
class complex:
def __init__(self,real,image):
self.real=real
self.image=image
def __str__(self):
return self.real+'+'+self.image+'i'
if __name__=='__main__':
c=complex('2.3','5.1')
print(c)
>>2.3+5.1i
知识点2.继承
1.语法要求
- class 子类类名(父类1,父类2.....)
- 若没有继承任何父类,默认继承object
- 支持多继承
- 定义子类时
- 和前面的区别,在类名后面➕()
2.super().__init__()表示直接调用父类的__init__(self......参数)函数
1.子类可以直接继承父类所有的属性和方法!!!!
2.同时在子类可以增加父类不存在的方法或属性
class person:
def setname(self,name):
self.name=name
class student(person):
def setsno(self,sno):
self.sno=sno
class teacher(person):
def settno(self,tno):
self.tno=tno
class ta(student,teacher):
def setteacher(self,teacher):
self.teacher=teacher
if __name__=='__main__':
stu=student()
stu.setname('zhaghong')
stu.setsno('123456')
print(stu.name,stu.sno)
ta=ta()
ta.setname('mali')
ta.setteacher('zhuzhu')
ta.settno('123')
print(ta.name,ta.teacher,ta.tno)
>>zhaghong 123456
mali zhuzhu 123
调用时:使用子类对象.父类/子类函数名
3.多重继承
含义:一个子类继承了多个父类
- 一个父亲可以有多个孩子
- 一个孩子也可以有多个父亲
知识点3.方法重写
一.定义
子类可以对从父类继承过来的方法重新定义
class person:
def __init__(self,name,age):
self.name=name
self.age=age
def info(self):
print(self.name,self.age)
class student(person):
def __init__(self,name,age,number):
self.number=number
super().__init__(name,age)
class teacher(person):
def __init__(self,name,age,address):
super().__init__(name,age)
self.address=address
stu1=student('xiaoming',30,'123456789')
stu1.info()
stu2=teacher('zhanghua',19,"dalian")
stu2.info()
大自然的搬运工super函数,是不可以在后面函数名的括号添加self函数的
二.多态
- 一定要设一个函数fly() 则p和r可以作为参数传进去
- 在调用函数时用类作为函数的参数 来调用对应类的方法
class plane:
def fly(self):
print("飞机在天空飞翔")
class rocket:
def fly(self):
print("火箭爆炸了")
def fly(obj):
obj.fly()
p=plane()
r=rocket()
fly(p)
fly(r)
>>飞机在天空飞翔
火箭爆炸了
三.鸭子类型嘎嘎嘎嘎~
1.多态就是借助鸭子类型实现的!
2.如上图的plane和rocket类都有fly函数 故实例化后可调用fly函数以类名作为参数调用
知识点4.super
一.默认
supur默认情况下有两个参数(当前所在类名,self)
第一个参数:获取父类的对象类名
第二个参数:父类对象函数的第一个参数
二.课本例题之114.30题
程序解释:
实例化将张三传进person的类的init函数中,此时self.name等于张三,Per.display是调用person里面的display函数,最终第一行会输出张三
倒数第二行代码将78和李四赋值给init函数,init函数的第一行代码是去寻找student父类person的init函数,所以这时候李四的名字就赋给了self name,最后一行代码执行students的display函数display函数的第一行代码是去寻找student父类person的display函数输出李四的名字,所以第二行输出的是李四的名字,
接着是display的第二行代码是输self.sno所以第三行输出的是78
class person:
def __init__(self,name):
self.name=name
def display(self):
print(self.name)
class student(person):
def __init__(self,sno,name):
super().__init__(name)
self.sno=sno
def display(self):
super(student,self).display()
print(self.sno)
if __name__=="__main__":
per=person('zhangsan')
per.display()
stu=student('78','lisi')
stu.display()
知识点5.instance&issubclass和type
instance:判断对象所属的类是否是指定类
知识点6.类方法
- @classmethod
- 直接修改类属性
- 传入第一个参数是cls(类)
- 既可以通过类名调用,也可以通过实例对象调用
倒数第三行将一赋值给person.num,倒数第二行用类名调用gets name的类,从而返回的值1的值给r最后打印r
class person:
def __init__(self,num):
person.num=num
@classmethod
def getname(cls):
return person.num
if __name__=='__main__':
a=person(1)
r=person.getname()
print(r)
知识点7.@property
1.将类的属性访问和赋值转为方法调用
2.用@property定义获取属性值的方法gatter(只读属性)
3.设置属性值的方法setter
属性以方法形式展示出来,但引用的时候还是 类.方法名
改的时候也是类.方法名=xxx 只不过是同时在@property后面加上@方法名.setter
4.使用gatter和setter时要确保属性是私有的,不可随意更改 外界不能改,只有提高setter方法时才可修改
class book(): def __init__(self,price): self._price=price#私有属性 @property def price(self): return self._price#定义了一个获取值的函数 @price.setter#更改时引入setter def name(self,price): if price>0: self._price=price r=book(80) print(r.price) book.price=88#方法的外表,属性的内心