前言:继承是Python编程中重要环节,但是需要注意的点比较多,下面我们就一起来康康吧。
一、继承是什么?都能继承什么?继承:子类继承父类,继承后就拥有父类的可用的所有属性和方法
可以继承:类属性,类方式、 _属性/_方法(浅私有)
不可以继承: __属性/__方法(深私有):不能被继承
class A_test: #父类
__age = 18
_sex = "男"
def __init__(self):
pass
def name(self):
print("我是父类")
class B_test(A_test): #继承父类(A_test)
def jicheng(self):
print("打印父类的_sex:",A_test._sex) #调用父类(A_test)中的,浅私有属性:_sex
# print("打印父类的__age:",A_test.__age) #这里调用就会报错,因为__age上父类是深浅私有属性
cl = B_test() #实例化
cl.jicheng() #调用子类的jicheng方法
响应:
打印父类的_sex: 男
二、可以多继承吗?
答:python多继承 -- 继承多个父类 --
继承的语法:
class 子类(父类1,父类2.....):
PASS
子类继承父类,拥有父类所有属性和方法,除了私有化除外
三、可以继承构造方法(__init__)方法吗??
答:可以,但是分情况
a)情况1:子类不重写 __init__,实例化子类时,会自动调用父类定义的 __init__
解释:父类有__init__方法,子类没有时,自动调用父类的__init__方法
class A_test: #父类
__age = 18
_sex = "男"
def __init__(self):
print("我是父类的构造方法")
def name(self):
print("我是父类")
class B_test(A_test): #继承父类(A_test)
#这里子类没写__init__方法,只能调用父类的方法
def jicheng(self):
pass
cl = B_test() #实例化
cl.jicheng() #调用子类的jicheng方法
响应:
我是父类的构造方法
打印父类的_sex: 男
我是父类的构造方法
#这里看到有两个“我是父类的构造方法”打印,是因为第一次继承父类,父类自己运行了一次,子类没有构建方法,又调用了父类的构建方法,又打印了一次
b)情况2:子类如果重写了__init__ 时,实例化子类,就不会调用父类已经定义的 __init__,语法格式如下:
解释:父类和子类都有__init__方法时,优先执行子类的__init__方法
class A_test: #父类
__age = 18
_sex = "男"
def __init__(self):
print("我是父类的构造方法")
def name(self):
print("我是父类")
class B_test(A_test): #继承父类(A_test)
def __init__(self):
print("我子类自己的__init__方法")
def jicheng(self):
pass
cl = B_test() #实例化
cl.jicheng() #调用子类的jicheng方法
响应:
我子类自己的__init__方法
c)情况3:父类子类都有__init__方法 时,子类想调用父类的__init__的方法?
解释:——super(子类,self).__init__(参数1,参数2,....) =>super().__init__() 即可
class A_test: #父类
__age = 18
_sex = "男"
def __init__(self):
print("我是父类的构造方法,我在这里")
def name(self):
print("我是父类")
class B_test(A_test): #继承父类(A_test)
def __init__(self):
print("我子类自己的__init__方法")
def jicheng(self):
super().__init__() #继承父类__init__方法,但是默认执行顺序还是 子类__init__ > 父类 __init__
cl = B_test() #实例化
cl.jicheng() #调用子类的jicheng方法
响应:
我子类自己的__init__方法
我是父类的构造方法,我在这里
四、可以重写父类方法吗?
答:情况1——可以,然后全部重写父类方法
class A_test: #父类
__age = 18
_sex = "男"
def __init__(self):
print("我是父类的构造方法,我在这里")
def name(self):
print("我是父类的姓名")
def age(self):
print("我是父类的年龄")
class B_test(A_test): #继承父类(A_test)
def __init__(self):
print("我子类自己的__init__方法")
def name(self): #与父类方法同名,直接重写父类方法
print("我是重写你的子类方法")
def verify(self):
self.name()
cl = B_test() #实例化
cl.verify() #调用子类的jicheng方法
响应:
我子类自己的__init__方法
我是重写你的子类方法
答:情况2——可以,在父类方法上增加功能
class A_test: #父类
__age = 18
_sex = "男"
def __init__(self):
print("我是父类的构造方法,我在这里")
def name(self):
print("我是父类的姓名")
def age(self):
print("我是父类的年龄")
class B_test(A_test): #继承父类(A_test)
def __init__(self):
print("我子类自己的__init__方法")
def name(self): #与父类方法同名,增加父类的方法功能
super().name()
print("我是重写你的子类name方法")
def verify(self):
self.name()
cl = B_test() #实例化
cl.name() #调用子类的jicheng方法
响应:
我子类自己的__init__方法
我是父类的姓名
我是重写你的子类name方法
五、完整例子
class Father: #新建一个父类
def __init__(self,name,age):
self.name = name
self.age = age
def enr_money(self,wokr):
print("{}靠{}工作赚钱".format(self.name,wokr))
def hooby(self,favirate):
print("{}的爱好:{}".format(self.name,favirate))
class Son(Father): ##WWclass 子类(父类1,父类2.....)继承
def study(self,content):###你想在父类的功能或者属性以外,添加属于你自己特色的方法。
print("我通过学习{}来提升自己".format(content))
def enr_money(self,wokr1):#在与父类同名的方法的内,想调用父类的同名方法
super().enr_money(wokr1)##super().超类来使用父类的方法
print("{}通过{}投资理财再赚了 2000块!!!!".format(self.name,wokr1))###在父类的基础上,额外增加了,父类原基础上的不会变
# def enr_money(self, work1,work2): # 在与父类同名方法,但是我要完全重写。不用父类的代码。
# print("{} 通过{} 和{}来赚钱".format(self.name,work1,work2))
mama = Father("老汪",41) #继承后依然拥有父类所有属性和方法,除了私有化除外,所以这里都是需要填参数的
mama.enr_money("工地")
mama.hooby("看电影")
wang = Son("小汪",22)
wang.study("柠檬班")
wang.enr_money("基金")
响应:
老汪靠工地工作赚钱
老汪的爱好:看电影
我通过学习柠檬班来提升自己
小汪靠基金工作赚钱
小汪通过基金投资理财再赚了 2000块!!!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)