面向对象知识
一、 类的定义
基本形式:
class ClassName(object):
Statement
1.class定义类的关键字
2.ClassName类名,类名的每个单词的首字母大写。
3.object是父类名,object是一切类的基类。在python3中如果继承类是基类可以省略不写。
二、类的初始化
# __init__
定义类时,这种方法可以使类对象实例按某种特定的模式生产出来。
后面的参数中第一个参数我们约定俗成的为self参数名,
self代表的是在类实例化后这个实例对象本身。
初始化函数除了有self这个参数表示实例对象本身之外,
其他的参数的定义也遵循函数的必备参数和默认参数一样的原则,
必备参数就是在实例化时一定要传入的参数,
默认参数就是在定义时可以给这个参数一个初始值。
三、类的实例化
基本形式:实例对象名 = 类名(参数)
在实例化的过程中,self代表的就是这个实例对象自己。
实例化时会把类名后面接的参数传进去赋值给实例,
这样传进去的参数就成为了这个实例对象的属性。
实例化的过程遵循函数调用的原则。
在实例化时也必须个数和顺序与定义时相同(使用关键字参数可以改变传参的顺序)。
当初始化函数定义时使用了默认参数时,在实例化时默认参数可以不传参这时
这个实例对象就会使用默认的属性,如果传了参数进去则会改变这参数值,
使实例化对象的属性就为你传进来的这个参数。
三(1) 类的定义示例
class Fruits: fruits = 'xxxxxx' # 类属性 def __init__(self,name,color,weight=90): self.name = name self.color = color self.weight = weight self.fruits = 'yyyyy' # 实例属性 def show(self): print('我的重量是%s'% self.color) class Apple(Fruits): def __init__(self,color,weight,shape): Fruits.__init__(self,'apple',color,weight) # 调用父类的初始化函数 self.shape = shape def eat(self): print('被吃掉了。。。。') ap1 = Apple('red',100,'圆的')
a、必备参数实例:
class Fruits: def __init__(self,name,color): self.name = name self.color = color #初始化实例 fr1=Fruits('apple','red') fr2=Fruits('banana','yellow')
# 类的实例化,当类中有必备参数时,实例化类的时候必须传入参数,比如水果类Fruits中的初始化函数init中的name和color是必备参数,在初始化时候就必须对这两个参数进行赋值,演示操作如下所示:
fr1 = Fruits('apple','red') ----->传入参数'apple'和'red' fr2 = Fruits('banana','yellow') ------>传入参数'banana'和'yellow'
如果不赋值,直接初始化就会报错:
class Fruits: def __init__(self,name,color): self.name = name self.color = color #fr1=Fruits('apple','red') #fr2=Fruits('banana','yellow') fr4 = Fruits() fr5 = Fruits() 输出结果: Traceback (most recent call last): File "D:/Python36/note/类基础知识.py", line 9, in <module> fr4 = Fruits() TypeError: __init__() missing 2 required positional arguments: 'name' and 'color' >>>
b、默认参数示例:
class Fruits: def __init__(self,name,color,weight=90): self.name = name self.color = color self.weight=weight ---->初始化时候赋值实例中的weight等于传入的weight值 fr1=Fruits('apple','red') fr2=Fruits('banana','yellow')
输出结果:
>>> fr1.name
'apple'
>>> fr1.color
'red'
>>> fr1.weight
90
>>> fr2.name
'banana'
>>> fr2.color
'yellow'
>>> fr2.weight
90
>>>
对于默认参数weight=90而言,这个在类初始化的时候可以不赋值,也可以赋值,但是如果要想实例化后实例有该属性,就必须在初始化中进行初始化赋值一下,即self.weight=weight;
如果对默认参数不赋值,则实例化之后,示例不具备类的默认属性
class Fruits: def __init__(self,name,color,weight=90): self.name = name self.color = color fr1=Fruits('apple','red') fr2=Fruits('banana','yellow') 输出结果: >>> fr1.color 'red' >>> fr1.name 'apple' >>> fr1.weight Traceback (most recent call last): File "<pyshell#56>", line 1, in <module> fr1.weight AttributeError: 'Fruits' object has no attribute 'weight' >>> fr2.name 'banana' >>> fr2.color 'yellow' >>> fr2.weight Traceback (most recent call last): File "<pyshell#59>", line 1, in <module> fr2.weight AttributeError: 'Fruits' object has no attribute 'weight' >>>
c、修改默认参数值
class Fruits: def __init__(self,name,color,weight=90): self.name = name self.color = color self.weight = weight fr1=Fruits('apple','red',200) fr2=Fruits('banana','yellow',150) fr3 = Fruits('apple','green') 输出结果: >>> fr1.weight 200 >>> fr2.weight 150 >>> >>> fr3.weight 90 >>>
说明:此处输出weight值已经不是当初默认90,而是我们自己定义的200和150,说明我们定义的值已经覆盖了默认的值,同时如果不传值给weight,则直接输出默认值90(fr3实例所示)
四、isinstance(实例名,类名)
判断一个实例是不是这个类的实例。
>>> a = 'python' >>> isinstance(a,str) True >>> isinstance(fr1,Fruits) True >>> isinstance(fr2,Fruits) True >>> isinstance(fr3,Fruits) True >>>
判断是否为真,返回布尔型数据,True or False
五、 类和实例属性
类属性
.类属性是可以直接通过“类名.属性名”来访问和修改。
.类属性是这个类的所有实例对象所共有的属性,
任意一个实例对象都可以访问并修改这个属性(私有隐藏除外)。
.对类属性的修改,遵循基本数据类型的特性:列表可以直接修改,字符串不可以,
所以当类属性是一个列表时,通过任意一个实例对象对其进行修改。
但字符串类型的类属性不能通过实例对象对其进行修改。
五(1)类属性通过实例.属性名来访问:
class Fruits: fruits='xxxxxx' ------->类的属性fruits def __init__(self,name,color,weight=90): self.name = name self.color = color self.weight = weight fr1 = Fruits('apple','red',200) fr2 = Fruits('banana','yellow',150) fr3 = Fruits('apple','green') 测试结果: >>> fr1.fruits 'xxxxxx' >>> fr2.fruits 'xxxxxx' >>> fr3.fruits 'xxxxxx' >>>
类的属性可以通过实例.类属性名格式来访问,这里fr1.fruits和fr2.fruits以及fr3.fruits都是通过实例.属性名来访问的
这里注意区别的是:当类中和初始化方法中的属性名字相同时,则初始化方法中实例属性将会把类的属性覆盖掉,输出的是初始化方法中的类属性
class Fruits: fruits='xxxxxx' ---------->初始化方法外面定义的类属性fruits def __init__(self,name,color,weight=90): self.name = name self.color = color self.weight = weight self.fruits = 'YYYYYY' ------------->初始化方法里定义的实例属性fruits fr1 = Fruits('apple','red',200) fr2 = Fruits('banana','yellow',150) fr3 = Fruits('apple','green') 测试结果: >>> fr1.fruits 'YYYYYY' >>> fr2.fruits 'YYYYYY' >>> fr3.fruits 'YYYYYY' >>>
说明:此时输出初始化方法中的实例的属性值,而类中的属性fruits值被覆盖掉,从上述代码中可以得出,用了self.属性名表示实例属性,直接属性名fruits=‘xxxxx’表示类属性
五(2)实例属性
.在属性前面加了self标识的属性为实例的属性。
.在定义的时候用的self加属性名字的形式,在查看实例的属性时
就是通过实例的名称+‘.’+属性名来访问实例属性。
方法属性
.定义属性方法的内容是函数,函数的第一个参数是self,代表实例本身。
一些说明:
.数据属性会覆盖同名的方法属性。减少冲突,可以方法使用动词,数据属性使用名词。
.数据属性可以被方法引用。
.一般,方法第一个参数被命名为self,,这仅仅是一个约定,
self没有特殊含义,程序员遵循这个约定。
类中方法访问示例:
class Fruits: fruits='xxxxxx' def __init__(self,name,color,weight=90): self.name = name self.color = color self.weight = weight self.fruits = 'YYYYYY' def show(self): print('我的重量是%s' % self.weight) fr1 = Fruits('apple','red',200) fr2 = Fruits('banana','yellow',150) fr3 = Fruits('apple','green') 输出结果: >>> fr1.show <bound method Fruits.show of <__main__.Fruits object at 0x0000000002B384E0>> >>> fr1.show() 我的重量是200 >>> fr2.show <bound method Fruits.show of <__main__.Fruits object at 0x0000000002B386D8>> >>> fr2.show() 我的重量是150 >>> fr3.show <bound method Fruits.show of <__main__.Fruits object at 0x0000000002BDE4A8>> >>> fr3.show() 我的重量是90 >>>
通过实例来访问类中的方法的方式为实例名.方法名(),上述代码中fr1.show()、fr2.show()、fr3.show()都是访问类中的方法
五(3)查看类中的属性和实例属性可以调用__dict__方法返回属性组成的字典。
class Fruits: fruits='xxxxxx' def __init__(self,name,color,weight=90): self.name = name self.color = color self.weight = weight self.fruits = 'YYYYYY' def show(self): print('我的重量是%s' % self.weight) fr1 = Fruits('apple','red',200) fr2 = Fruits('banana','yellow',150) fr3 = Fruits('apple','green') print(fr1.__dict__['name']) print(fr2.__dict__['name']) print(fr3.__dict__['name']) 输出结果: apple banana apple
五(4)实例化之后的类中的属性可以用实例.属性名='赋值'的方法来修改实例化时的赋值
class Fruits: fruits = 'xxxxx' def __init__(self,name,color,weight=90): self.name = name self.color = color self.weight = weight self.fruits = 'YYYYY' def show(self): print('我的体重为%s' % self.weight) #类的实例化 fr1 = Fruits('apple','red') fr2 = Fruits('banana','yellow') fr3 = Fruits('apple','green',100) 输出结果: >>> fr1.color 'red' >>> fr1.color = 'green' >>> fr1.color 'green' >>> fr2.color 'yellow' >>> fr2.color = 'black' >>> fr2.color 'black' >>> fr3.color 'green' >>> fr3.color = 'white' >>> fr3.color 'white' >>>
从上述代码中可以发现开始实例化类赋值给color属性的值,在实例化之后依然可以修改
所以为了防止实例中的属性值被修改,这里引入私有变量
六、 私有变量 & 类本地变量。
以一个下划线开头的命名(无论是函数,方法或数据成员),
都会被隐藏起来。但直接将命名完整的写下还是一样可以访问到。
单下划线只是隐藏了属性,但还是可以从外部访问和修改。
class Fruits: fruits = 'xxxxx' def __init__(self,name,color,weight=90): self._name = name self._color = color self._weight = weight self.fruits = 'YYYYY' def show(self): print('我的体重为%s' % self.weight) #类的实例化 fr1 = Fruits('apple','red') fr2 = Fruits('banana','yellow') fr3 = Fruits('apple','green',100)
测试结果:
从上述查找发现,实例对应的name、color、weight属性都被隐藏起来,下面演示是否可以访问或者修改
>>> fr1._name 'apple' >>> fr1._name = 'cell' >>> fr1._name 'cell' >>> fr2._name 'banana' >>> fr2._name = 'paopao' >>> fr2._name 'paopao' >>> fr3._name 'apple' >>> fr3._name = 'qq' >>> fr3._name 'qq' >>>
结果发现虽然隐藏的实例的属性,但是属性对应的值仍然可以访问,而且可以修改
对于以两个下划线开头的命名,一样会被隐藏,只能在内部访问和修改,
不能在外部访问,因为它变成了“_类名__属性”的形式。
在外部只能通过这种形式才能访问和修改。
双下划线开头的属性就变成了私有变量,即使能改也不要在外部外部修改了。
私有变量的作用就是确保外部代码不能随意修改对象内部的状态。
示例代码:
class Fruits: fruits = 'xxxxx' def __init__(self,name,color,weight=90): self.__name = name self.__color = color self._weight = weight self.fruits = 'YYYYY' def show(self): print('我的体重为%s' % self.weight) #类的实例化 fr1 = Fruits('apple','red') fr2 = Fruits('banana','yellow') fr3 = Fruits('apple','green',100)
属性name和color前面各添加了两个下划线,那么在实例中显示如下:
此时name和color的属性已经被改名为:_类名_属性名的结构了,那么如果要访问则可以通过如下方法访问:
在类的外部访问:
>>> fr1._Fruits__name 'apple' >>> fr2._Fruits__name 'banana' >>> fr3._Fruits__name 'apple' >>> >>> fr1._Fruits__color 'red' >>> fr2._Fruits__color 'yellow' >>> fr3._Fruits__color 'green' >>>
如果在类的内部访问则可以直接用__属性名的结构访问:
class Fruits: fruits = 'xxxxx' def __init__(self,name,color,weight=90): self.__name = name self.__color = color self._weight = weight self.fruits = 'YYYYY' def show(self): print('我的名字为%s 颜色为%s' % (self.__name,self.__color)) #类的实例化 fr1 = Fruits('apple','red') fr2 = Fruits('banana','yellow') fr3 = Fruits('apple','green',100) #测试输出结果: >>> fr1.show() 我的名字为apple 颜色为red >>> fr2.show() 我的名字为banana 颜色为yellow >>> fr3.show() 我的名字为apple 颜色为green >>>
注:另外对于单个下划线或者两个下划线的属性虽然可以修改,但是一般不建议去修改,直接使用原来的赋值即可
七、 数据封装:
.在类里面数据属性和行为用函数的形式封装起来,
访问时直接调用,不需知道类里面具体的实现方法。
八、 继承:
.在定义类时,可以从已有的类继承,
被继承的类称为基类(或者父类),新定义的类称为派生类(子类)。
如果子类中没有自定义任何方法和属性,则子类中所有的方法和属性均来自于父类
class Fruits: fruits = 'xxxxx' def __init__(self,name,color,weight=90): self.__name = name self.color = color self._weight = weight self.fruits = 'YYYYY' def show(self): print('我的名字为%s 颜色为%s' % (self.__name,self.color)) class Apple(Fruits): pass ap1 = Apple('apple','red')
测试输出结果:
>>> ap1.color
'red'
>>> ap1.show()
我的名字为apple 颜色为red
>>> ap1.weight
90
>>> ap1._Fruits__name
'apple'
>>>
如果将子类中的init方法重写,那么父类中init方法中的属性都会丢弃掉:
class Fruits: fruits = 'xxxxx' def __init__(self,name,color,weight=90): self.__name = name self.color = color self.weight = weight self.fruits = 'YYYYY' #实例属性 def show(self): print('我的名字为%s 颜色为%s' % (self.__name,self.color)) class Apple(Fruits): def __init__(self,color,weight): pass ap1 = Apple('apple','red')
测试结果:
从该显示中可以发现,子类中重新了init方法,父类中的init方法中的属性name、color、weight、fruits都会被丢弃。如果要用自定义的属性,则必须在重写的init中对对应的属性进行赋值,具体如下:
class Fruits: fruits = 'xxxxx' def __init__(self,name,color,weight=90): self.__name = name self.color = color self.weight = weight self.fruits = 'YYYYY' #实例属性 def show(self): print('我的名字为%s 颜色为%s' % (self.__name,self.color)) class Apple(Fruits): def __init__(self,color,weight): self.color = color self.weight = weight
ap1 = Apple('apple','red')
输出结果为:
>>> ap1.color 'apple' >>> ap1.weight 'red' >>>
但是仔细一看感觉不对劲,color的值怎么是apple,weight的值是red,进一步分析,发现在ap1 = Apple('apple','red')实例化的时候,将'apple'穿给了color,'red'传给了weight,所以这个传参是按照子类自己的init方法来进行传参,如果子类没有写init方法,那么就按照父类的init方法进行传参赋值,所以对上述代码进行修改:
class Fruits: fruits = 'xxxxx' def __init__(self,name,color,weight=90): self.name = name self.color = color self.weight = weight self.fruits = 'YYYYY' #实例属性 def show(self): print('我的名字为%s 颜色为%s' % (self.name,self.color)) class Apple(Fruits): def __init__(self,color,weight): self.color = color self.weight = weight self.name = 'apple' #----------->直接苹果的名字赋值写进去 ap1 = Apple('red',100) 测试结果: >>> ap1.color 'red' >>> ap1.name 'apple' >>> ap1.weight 100 >>>
但是综合修改和初始的代码,发现修改的部分的跟以前的代码有重复,主要表现在:
self.name = name
self.color = color
self.weight = weight
所以这里再次对代码做进一步的修改:
class Fruits: fruits = 'xxxxx' def __init__(self,name,color,weight=90): self.name = name self.color = color self.weight = weight self.fruits = 'YYYYY' #实例属性 def show(self): print('我的名字为%s 颜色为%s' % (self.name,self.color)) class Apple(Fruits): def __init__(self,color,weight): Fruits.__init__(self,'apple',color,weight) #---------->调用父类中的init方法 ap1 = Apple('red',100) 访问属性输出: >>> ap1.name 'apple' >>> ap1.color 'red' >>> ap1.weight 100 >>>
说明:在子类中执行Fruits.__init__(self,'apple',color,weight)之后,相当于在子类中执行了原来父类中的:
def __init__(self,name,color,weight=90): self.name = name self.color = color self.weight = weight
这部分语句,并且在执行过程中将'apple'在子类中直接运用Fruits.__init__(self,'apple',color,weight)语句传递给调用父类的init中的name参数。
如果子类的init中有父类中没有的属性,则必须用self.属性='属性'来做个赋值,这里shape,则用self.shape = shape
class Fruits: fruits = 'xxxxx' def __init__(self,name,color,weight=90): self.name = name self.color = color self.weight = weight self.fruits = 'YYYYY' #实例属性 def show(self): print('我的名字为%s 颜色为%s' % (self.name,self.color)) class Apple(Fruits): def __init__(self,color,weight,shape): Fruits.__init__(self,'apple',color,weight) self.shape = shape ap1 = Apple('red',100,'boll') 输出结果: >>> ap1.shape 'boll' >>>
在子类实例化时,调用父类init方法中属性值会覆盖子类实例化时赋给对应变量的值:
class Fruits: fruits = 'xxxxx' def __init__(self,name,color,weight=90): self.name = name self.color = color self.weight = weight self.fruits = 'YYYYY' #实例属性 def show(self): print('我的名字为%s 颜色为%s' % (self.name,self.color)) class Apple(Fruits): def __init__(self,color,weight,shape): Fruits.__init__(self,'apple','yellow',weight) self.shape = shape ap1 = Apple('red',100,'boll') 输出结果: >>> ap1.color 'yellow' >>>
注意:在实例化时传入的color参数对应的值为red,但是初始化方法init中直接赋值color为yellow,这里初始化方法init中直接赋值会覆盖掉实例化时传值,在调用父类属性时,要么直接在调用时对属性赋值要么在子类中直接重写,否则就户报错
class Fruits: fruits = 'xxxxx' def __init__(self,name,color,weight=90): self.name = name self.color = color self.weight = weight self.fruits = 'YYYYY' #实例属性 def show(self): print('我的名字为%s 颜色为%s' % (self.name,self.color)) class Apple(Fruits): def __init__(self,name,color,weight,shape): Fruits.__init__(self,'apple','yellow',weight) self.shape = shape self.name = name --------------->重写赋值 ap1 = Apple('pear','red',100,'boll') 输出结果: >>> ap1.name 'pear' >>> ap1.color 'yellow' >>> ap1.shape 'boll' >>>
如果在子类中重写了父类中的方法,那么子类实例化后执行父类方法时,就会失效,此时输出的是子类重写之后的方法
重写show方法前:
class Fruits: fruits = 'xxxxx' def __init__(self,name,color,weight=90): self.name = name self.color = color self.weight = weight self.fruits = 'YYYYY' #实例属性 def show(self): print('我的名字为%s 颜色为%s' % (self.name,self.color)) class Apple(Fruits): def __init__(self,color,weight,shape): Fruits.__init__(self,'apple','yellow',weight) self.shape = shape ap1 = Apple('red',100,'boll') 调用show方法: >>> ap1.show() 我的名字为apple 颜色为yellow >>>
重写show方法后:
class Fruits: fruits = 'xxxxx' def __init__(self,name,color,weight=90): self.name = name self.color = color self.weight = weight self.fruits = 'YYYYY' #实例属性 def show(self): print('我的名字为%s 颜色为%s' % (self.name,self.color)) class Apple(Fruits): def __init__(self,color,weight,shape): Fruits.__init__(self,'apple','yellow',weight) self.shape = shape def show(self): print('输出子类的show方法') ap1 = Apple('red',100,'boll') 调用show方法: >>> ap1.show() 输出子类的show方法 >>>
除了重写,子类也可以定义自己的方法:
class Fruits: fruits = 'xxxxx' def __init__(self,name,color,weight=90): self.name = name self.color = color self.weight = weight self.fruits = 'YYYYY' #实例属性 def show(self): print('我的名字为%s 颜色为%s' % (self.name,self.color)) class Apple(Fruits): def __init__(self,color,weight,shape): Fruits.__init__(self,'apple','yellow',weight) self.shape = shape def show(self): print('输出子类的show方法') def eat(self): print('this apple eaten') ap1 = Apple('red',100,'boll') 调用方法: >>> ap1.eat() this apple eaten >>>
但是父类的实例fr1、fr2、fr3是没有子类实例中eat方法的,子类中 方法只能在子类中使用,父类使用不了;但是父类的方法如果被子类继承了,则可以被子类继续使用
.在类中找不到调用的属性时就搜索基类,
如果基类是从别的类派生而来,这个规则会递归的应用上去。
反过来不行。
.如果派生类中的属性与基类属性重名,那么派生类的属性会覆盖掉基类的属性。
包括初始化函数。
.派生类在初始化函数中需要继承和修改初始化过程,
使用’类名+__init__(arg)’来实现继承和私有特性,也可以使用super()函数。
issubclass(类名1,类名2)
判断类1是否继承了类2
# 多态:
.多态是基于继承的一个好处。
.当派生类重写了基类的方法时就实现了多态性。
代码示例:
1 ''' 2 一、根据课堂上讲的内容写个人的类。 3 要求: 4 1. 属性包含姓名,性别,年龄。 5 2.方法可以自己随便写。 6 7 ''' 8 class Human: 9 def __init__(self,name,sex,age,hobby,reading): 10 self.name = name 11 self.sex = sex 12 self.age = age 13 self.hobby = hobby 14 self.reading = reading 15 def sleep(self): 16 print('%s每天晚上在10:00前必须睡觉' % self.name) 17 18 def active(self): 19 print('%s喜欢%s,不喜欢%s' %(self.name,self.hobby,self.reading)) 20 21 print('####################第一题代码输出#########################') 22 person1 = Human('小明','男','21','swimming','story') 23 person1.sleep() 24 person1.active() 25 26 person2 = Human('吉米','女','20','basketball','picutre') 27 person2.sleep() 28 person2.active() 29 print(' ') 30 31 ''' 32 二、写一个学生的类,学生的类继承了人的类。 33 要求: 34 1.在继承人的属性的基础上增加成绩这一属性。 35 2.把之前分数等级测试的函数写到这个类里,作为这个类的一种方法。 36 提示:把input和循环语句都删掉,只留下if判断。 37 ''' 38 39 class Student(Human): 40 def __init__(self,score): 41 self.score = score 42 43 def info(self): 44 print('my name is %s,I am %s, and %s years,I like %s' %(self.name,self.sex,self.age,self.hobby)) 45 def test(self): 46 if type(self.score) == int or type(self.score)==float: 47 self.score = float(self.score) 48 if 90 <= self.score <=100: 49 print('成绩为:A') 50 elif 80<=self.score<90: 51 print('成绩为:B') 52 elif 60<=self.score<80: 53 print('成绩为:C') 54 elif 0<=self.score<60: 55 print('成绩为:D') 56 else: 57 print('输入有误!') 58 else: 59 print('输入有误,请重新输入') 60 61 print('####################第二题代码输出#########################') 62 student1=Student(8.1) 63 student1.test() 64 student2=Student(80.5) 65 student2.test() 66 student3=Student(91) 67 student3.test() 68 69 student4= Student(98) 70 student4.name = 'alex' 71 student4.sex='男' 72 student4.age=25 73 student4.hobby='walking' 74 student4.info()
1 #类的多继承 2 class A: 3 def show(self): 4 print('AAAAA') 5 6 7 class B: 8 def fun(self): 9 print('BBBBB') 10 11 12 13 14 class C(A,B): 15 pass 16 17 x = C() 18 #输出结果: 19 >>> x.show() 20 AAAAA 21 >>> x.fun() 22 BBBBB 23 >>>
类多继承,是类从上到下依次继承多个父类的方法和属性,这里类C继承了类A和B的的两个方法show和fun;那么如果两个父类中都有同样名称的方法,应该是哪个优先呢?我们继续往下看:
class A: def __init__(self,name,age,weight): self.name = name self.age = age self.weight = weight def show(self): print('AAAAA') class B: def __init__(self,name,age): self.name = name self.age = age def show(self): print('BBBBB') class C(A,B): def __init__(self,name,age): self.name = name self.age = age X=C('nike',18) #输出结果: >>> X.name 'nike' >>> X.age 18 >>> X.show() AAAAA >>>
从上面输出发现,多个类继承,方法名相同时,最前面类中的方法优先使用,且覆盖后面类中对应同样的方法