文章要点🐚作者简介:苏凉(专注于网络爬虫,数据分析)
🐳博客主页:苏凉.py的博客
🌐系列专栏:Python基础语法专栏
👑名言警句:海阔凭鱼跃,天高任鸟飞。
📰要是觉得博主文章写的不错的话,还望大家三连支持一下呀!!!
👉关注✨点赞👍收藏📂
- 前言
- 类的继承
- 继承的特点
- 子类不重写__ init __ 的继承(子类需要自动调用父类的方法)
- 子类重写__ init __ 的继承(子类不需要自动调用父类的方法)
- 子类重写 __init __ ,并且继承父类的构造方法(super)
- 方法的重写及重载
- 重写
- 重载
- 二者区别
- 对方法重写
- 基础重载方法
- 类的属性和方法()
- 类的私有属性
- 类的私有方法
- 面向对象中下划线的说明
- _前面单下划线
- __前面双下划线
- __ 前后双下划线 __
- 小结
类的继承在上篇文章中我们大致了解了python的面向对象编程,我们学会了如何定义一个类,如何在类中 创建实例以及如何对类中的属性和方法进行修改,下面我们将进入类的继承以及对类的方法重写及重载的学习!话不多说直接进入正题!!
上期传送锚点:
深入理解python面向对象编程(python基础语法004)
继承的特点如果要编写的类是另一个现成类的特殊版本,那我们就可以使用继承。一个类继承另一个类时,将自动获得另一个类的所有属性和方法,原有的类称为父类,而新的类称为子类,子类继承父类的所有属性和方法,同时还可以定义自己的属性和方法。
- 如果在子类中需要父类的构造方法就需要调用父类的构造方法,或者不重写父类的构造方法。
- 在调用父类的方法时,需要加上父类的类名前缀,且需要带上 self 参数变量。区别在于类中调用普通函数时并不需要带上 self 参数。
- Python 总是首先查找对应类型的方法,如果它不能在子类中找到对应的方法,它才开始到父类中逐个查找。(先在子类中查找调用的方法,找不到才去夫类中找)。
子类不重写 __ init __,实例化子类时,会 自动调用父类定义的 __ init __。
# 创建一个父类
class Base_father:
def __init__(self,name,age):
self.name = name
self.age = age
print('调用了父类的name')
# 创建子类
class Base_son(Base_father):
def getname(self):
print(f'姓名:{self.name}')
print(f'年龄:{self.age}')
return '运行完毕!!'
num1 = Base_son('suliang',21)
print(num1.getname())
运行结果:
在子类中没有重写 __ init __方法,在调用子类进行实例化时,就默认调用父类的 __ init __ 方法。
子类重写__ init __ 的继承(子类不需要自动调用父类的方法)如果重写了__ init __ 时,实例化子类,就不会调用父类已经定义的 __ init __。
# 创建一个父类
class Base_father:
def __init__(self,name,age):
self.name = name
self.age = age
print('调用了父类的name')
# 创建子类
class Base_son(Base_father):
def __init__(self,name,age):
self.name = name
self.age = age
print('调用了我自己定义的方法!!')
def getname(self):
print(f'姓名:{self.name}')
print(f'年龄:{self.age}')
return '运行完毕!!'
num1 = Base_son('suliang',21)
print(num1.getname())
运行结果:
通过上面两个例子就可以清楚的看到,若是子类自己定义了一个初始化方法 __ init __,那么将不在调用父类已经调用好的 __ init __ 方法。
如果重写了__ init __ 时,要继承父类的构造方法,可以使用 super关键字。
语法:super(子类,self).__ init __(参数)
# 创建一个父类
class Base_father:
def __init__(self,name,age):
self.name = name
self.age = age
print('调用了父类的name')
# 创建子类
class Base_son(Base_father):
def __init__(self,name,age):
#利用super调用父类的构造函数
super(Base_son, self).__init__(name ,age)
print('-'*50)
self.name = name
self.age = age
print('调用了我自己定义的方法!!')
def getname(self):
print(f'姓名:{self.name}')
print(f'年龄:{self.age}')
return '运行完毕!!'
num1 = Base_son('suliang',21)
print(num1.getname())
运行结果:
方法的重写及重载 重写重载子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。
优点:子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
二者区别重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
- 方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载。
- 方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写
- 方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。
如果父类方法的功能不能满足你的需求,就可以在子类重写你父类的方法。
class Father:
def __init__(self,name):
self.name = name
def list(self):
print(f'name:{self.name}')
class Son(Father):
def list(self):
print(f'姓名:{self.name}')
return '执行完毕!!'
num1 = Son('suliang')
print(num1.list())
运行结果:
- 构造函数
__ init __ ( self [,args] )
- 析构方法, 删除一个对象
__ del __( self )
- 转化为供解释器读取的形式
__ repr __( self )
- 用于将值转化为适于人阅读的形式
__ str __( self )
- 对象比较
__ cmp __ ( self, x )
方法重载的具体方法将在下一章进行详细介绍。在此之作简单说明!!
类的属性和方法() 类的私有属性在定义类的属性时,在前面加入__(两个下划线)即代表私有属性,只能在类的内部调用,而不能在外部调用。
class List:
a = 5 #类的公有属性
__b = 6 #类的私有属性
obj = List()
print(obj.a)
print(obj.__b)
运行结果:
类的私有方法在定义方法时,在前面加入 __ (两个下划线)即可定义一个私有方法,只能在类的内部调用,语法为self.__方法名
class List:
def __init__(self ,a,b ):
self.a = a
self.b =b
def pri1(self):
# 定义一个公有方法
print(f'{self.a + self.b}')
return ' '
def __pri2(self):
# 定义一个私有方法
print(f'{self.a *self.b}')
def pri3(self):
self.__pri2() # 在内部调用私有方法
return ' '
obj = List(5,10)
print(obj.pri1())
print(obj.pri3())
运行结果:
__前面双下划线以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问。
__ 前后双下划线 __双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。
小结定义的是特殊方法,一般是系统定义名字 ,类似 __ init __() 之类的。
本篇文章带大家了解了类的继承,方法的重写以及重载的内容。一顿 *** 作下来是不是觉得并不难呢,当然这都是基础语法,深入的还需大家理解这其中的内涵,再慢慢的去实践。希望能对小伙伴们能够有所帮助,有什么问题或者不足的地方都可以私聊我解决!一起加油,共同进步!!
关注我,咱们下期再见!!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)