Python--面向对象--多继承和多肽
一、多继承
1.概念:所谓多继承,就是一个类同时有多个父类
2.语法
class 子类(父类1,父类2):
方法...
3.案例
1 class AAA(): 2 def methodAAA(self): 3 print("a的方法a") 4 class BBB(): 5 def methodBBB(self): 6 print("b的方法b") 7 class CCC(AAA,BBB): 8 def methodCCC(self): 9 self.methodAAA() 10 self.methodBBB() 11 print("c的方法c") 12 ccc = CCC() 13 ccc.methodCCC()
4.如果父类中有同名的方法,继承谁,取决于继承的顺序,靠前的先继承,靠后的被遮挡
如果是继承父类中的属性,第一个父类的属性会被直接继承,后面的属性忽略
1 class AAA(): 2 def methodAAA(self): 3 print("a的方法a") # 新增方法,BBB类中有同名方法 4 def methodBBB(self): 5 print("a的方法b") 6 class BBB(): 7 def methodBBB(self): 8 print("b的方法b") 9 class CCC(AAA,BBB): 10 def methodCCC(self): 11 self.methodAAA() 12 self.methodBBB() 13 print("c的方法c") 14 ccc = CCC() 15 ccc.methodCCC()
二、方法重写
所谓重写,就是在子类中,有一个和父类相同名字的方法,子类中的方法会覆盖掉 父类中的同名方法。
优先调用当前类中的方法,如果没有,找父类,顺着继承链直到找到object。如果再没有,抛出异常。
1 class SuperClass(): 2 def __init__(self,name): 3 self.name = name 4 def test(self): 5 print("父类的测试方法") 6 class SubClass(SuperClass): 7 def __init__(self,name,age): 8 # SuperClass.__init__(self,name) 9 # super(SubClass, self).__init__(name) 10 super().__init__(name) 11 self.age = age 12 # 子类重写父类方法 13 def test(self): 14 print("子类的测试方法") 15 print('name:'+self.name+",age:"+str(self.age)) 16 17 sub = SubClass('aa',12) 18 sub.test()
三、多肽
用一个函数来调用类里面的对象,但是不确定掉用的是哪个对象。
1 class F1(object): 2 def show(self): 3 print("F1.show") 4 class S1 (F1): 5 def show(self): 6 print("S1.show") 7 class S2(S1): 8 def show(self): 9 print("S2.show") 10 #创建一个函数 11 def func(obj): 12 obj.show() 13 #创建一个对象 14 obj1 = F1() 15 #函数的调用 16 func(obj1)
三、类属性,类方法
类属性
定义位置:
写在方法外
特点
属于类所有,所有对象共享一个类变量
访问方式:
成员变量的访问方式:
类外访问:
对象名.属性名
类内访问:
使用self.属性名
类变量的访问方式:
类外:
对象名.类变量名
如果是用于赋值的时候,会增加新的成员变量
如果是用于获取值的,则是有成员变量默认访问成员变量,如果没有,访问的为类变量
注意: 成员变量名不要与类变量名一致
类内:
可以使用 self.类属性名
也可以使用 类名.类属性名(推荐使用)
类方法
什么方法是类方法?
使用关键字@classmethod修饰的方法属于成为类方法,参数为cls
在类方法中不能使用self关键字
类方法属于类所有,不同于成员方法属于对象
调用方法:1. 类名.方法名() 2. 对象名.方法名()
通常使用方式1进行调用
使用技巧:一般情况下: 工具类中的方法 使用类方法、
1 class Student(): 2 schoolname = "西三旗校区" 3 def __init__(self,name,age,gender): 4 self.name = name 5 self.age = age 6 self.gender = gender 7 def introduce(self): 8 print("我叫:%s,今年%d岁,性别:%s"%(self.name,self.age,self.gender)) 9 print("校区名:%s"%self.schoolname) 10 print("校区名:%s"%Student.schoolname) 11 # 使用类方法展示个人信息 12 @classmethod 13 def showinfo(cls,stu): 14 print("学校名:%s"%cls.schoolname) 15 print("我叫:%s,今年%d岁,性别:%s" % (stu.name, stu.age, stu.gender))
stu1 = Student('奥斯特洛夫斯基',16,'男') stu2 = Student('奥斯特洛夫朱莉',17,'女') print(stu1.schoolname) print(stu2.schoolname) # 对象stu1中增加新的成员变量,赋值为“上海校区” stu1.schoolname = "上海校区" # 优先访问成员变量,类变量被屏蔽 print(stu1.schoolname) # stu2中没有成员变量schoolname,访问的为类变量schoolname print(stu2.schoolname)
# 默认初始化的类属性 print(Student.schoolname) # 修改类属性的值 Student.schoolname = '广州校区' print(Student.schoolname) print(stu1.schoolname) print(stu2.schoolname) stu1.introduce() # 类方法如何调用:1.对象名.类方法名(参数) 2.类名.类方法名(参数) stu1.showinfo(stu1) Student.showinfo(stu1)
静态方法:
定义方式:
@staticmethod
不需要任何参数
不需要对象,或者类进行参与,内存占用较低,类似与函数
# 静态方法 @staticmethod def testmehtod(stu): # 能否访问成员变量? # self.name = 'aaa' # cls.schoolname = '深圳校区' print(Student.schoolname) print("我叫:%s,今年%d岁,性别:%s" % (stu.name, stu.age, stu.gender))
#1. 类名.静态方法名()
Student.testmehtod(stu1)
#2. 对象名.静态方法名()
stu1.testmehtod(stu1)
四、总结
类:
默认规则表示私有属性跟私有方法:
self.__age = age
类属性
属于类所有,访问:类名.属性名, 所有对象可以共享
成员变量
属于对象所有
对象名.属性名
成员方法
默认参数self,对象参与
self:代表当前类的一个对象
类方法
默认参数cls,类参与
cls:代表的是当前类
静态方法
没有默认参数,没有对象或者类参与,等价与函数,出场率比较低

浙公网安备 33010602011771号