python 24 -- 面向对象(5)-- 类的继承、方法重载

类的继承

基本形式:

class <类名>(父类名):
	pass

即:在类名之后用圆括号括起来要继承的父类名

子类继承了父类之后,就具有了父类的属性和方法,但不能继承父类的私有属性和私有方法(属性名或方法名前缀为两个下划线的),子类中还可以重载来修改父类的方法,以实现与父类不同的行为表现和能力

>>> # 子类无法直接访问父类的私有属性和私有方法
>>> class Person(object):
...     def __init__(self,age):
...             self.__age = age
... 
>>> class Student(Person):
...     def dis(self):
...             print(self.__age)  # 这样就会报错,因为无法直接访问父类的私有属性
... 
>>> stu = Student(12)
>>> stu.dis()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in dis
AttributeError: 'Student' object has no attribute '_Student__age'
>>> # 解决思路:私有变量/私有方法,只能类内部才能访问,
>>> # 所以加个方法,用来调用私有属性/私有方法
>>> class Person:
...     def __init__(self,age):
...             self.__age = age
...     def age(self): 			 # 通过这层包装,继承的子类通过访问此方法来访问私有属性
...             return self.__age
...     def __set_age(self,age): # 这是私有方法,子类也无法直接访问
...             self.__age = age # 但Person类可以访问内部的私有方法
...     def setAge(self,age):    # 子类的实例可以正常调用此方法
...             self.__set_age(age)
... 
>>> class Student(Person):
...     def dis(self):
...             print(self.age())# python直接自己调用了访问函数诶
... 
>>> stu = Student(12)
>>> stu.dis()
12
>>> stu.setAge(28)
>>> stu.dis()
28

多重继承

多重继承的方式是在类定义时的继承父类括号中,以“,”分隔开要多重继承的父类。而在多重继承时,==继承顺序也是一个很重要的要素,如果继承的多个父类中有相同的方法名,但在子类中使用时未指定父类名,则python解释器将从左至右搜索,即调用先继承的类中的方法,例如:

源文件

# source code (vim)
stark@appledeMacBook-Air Desktop % vi jicheng.py    


# -*- coding:utf-8 -*-
class PrntA:    # define parent class
        namea = 'PrntA'
        def set_value(self,a):
                self.a = a
        def set_namea(self,namea):
                PrntA.namea = namea
        def info(self):
                print('PrntA:')
                print('%s,%s' % (PrntA.namea,self.a))
class PrntB:
        nameb = 'PrntB'
        def set_nameb(self,nameb):
                PrntB.nameb = nameb
        def info(self):
                print('PrntB:')
                print(PrntB.nameb)
class Sub1(PrntA,PrntB):        # define child class Sub1,who inherit from PrntA first
        pass
class Sub2(PrntB,PrntA):        # in an opposite order
        pass
class Sub3(PrntA,PrntB):
        def info(self):         # this changes the method info(),i'll explain the reason in the third part...
                PrntA.info(self)
                PrntB.info(self)
print('Using the first subclass...')
sub = Sub1()
sub.set_value('lapland')
sub.info()
sub.set_nameb('stark')
sub.info()
print('Using the second subclass...')
sub2 = Sub2()
sub2.set_value('lapland')
sub2.info()
sub2.set_nameb('stark')
sub2.info()
print('Using the third subclass...')
sub3 = Sub3()
sub3.set_namea('lapland')
sub3.set_value('gadot')
print('sub3:')
sub3.info()
print('sub:')
sub.info()
sub3.set_nameb('stark')
print('sub3:')
sub3.info()
print('sub:')
sub.info()

下面是结果【说明】

第一个子类先后继承了PrntA,PrntB,故实例化之后先调用的PrntA中的方法,之后在调用 info 方法时,实际上是用的PrntA中的方法,后面同理。namea 由于是类属性,从而随着 Sub3 的改变,Sub 中的数据也发生了变化(类属性与实例属性看这里~~

# result
stark@appledeMacBook-Air Desktop % python jicheng.py
Using the first subclass...
PrntA:
PrntA,lapland
PrntA:
PrntA,lapland
Using the second subclass...
PrntB:
stark
PrntB:
stark
Using the third subclass...
sub3:
PrntA:
lapland,gadot
PrntB:
stark
sub:
PrntA:
lapland,lapland
sub3:
PrntA:
lapland,gadot
PrntB:
stark
sub:
PrntA:
lapland,lapland

方法重载

当子类继承父类时,子类如果想修改父类的行为,则应通过方法重载来实现,其基本方法是在子类中定义一个和所继承的父类中需要重载的方法同名的一个方法

发布了64 篇原创文章 · 获赞 6 · 访问量 5549

猜你喜欢

转载自blog.csdn.net/weixin_45494811/article/details/104176159