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:代表的是当前类
静态方法
没有默认参数,没有对象或者类参与,等价与函数,出场率比较低
posted @ 2018-04-02 19:48  TiAmo_yu  阅读(837)  评论(0)    收藏  举报