创作不易,来了的客官点点关注,收藏,订阅一键三连❤
“人生苦短,我用python”,我是一个即将毕业的大学生,超超。如果你也爱python,不妨跟着萌新超超一起学习python,拿下python,一起加油,共同努力,拿到理想offer!
Python——什么是面向对象?类的定义、self和继承详解
Python——函数大全及使用方法! lambda?global?
Python——流程控制,pass?break?continue?这些你弄清楚了吗?
本期内容是python面向对象专题第二期,主要介绍python中的经典类与新式类,以及实例方法、静态方法与类方法,通过本期内容,你将知道经典类与新式类的区别、C3算法,以及实例方法,静态方法,类方法的三种使用和区别❤
目录
经典类与新式类
经典类与新式类在类型上的区别
经典类与新式类的继承原理与顺序
实例方法、静态方法与类方法
属性:对象描述的信息
三种方法
各种方法的区别(@staticmethod、@classmethod)
总结
属性包装与应用(@propert)
经典类
所有的类都是classobj类型,而类的实例都是instance类型
类与实例只有通过__class__属性进行关联
>>> class B: pass
...
>>> b = B()
>>> type(b)
新式类
类实例的类型是这个实例所创建自的类(通常是和类实例的__class__相同)
>>> class A: pass
...
>>> a = A()
>>> type(a)
>>>
python继承算法的发展
• Python2.2以前的版本:经典类(classic class)时代
• MRO的方法为DFS(深度优先搜索(子节点顺序:从左到右))
• Python2.2版本:新式类(new-style class)诞生,这时有两种MRO的方法
• 经典类MRO为DFS(深度优先搜索(子节点顺序:从左到右))
• 新式类MRO为BFS(广度优先搜索(子节点顺序:从左到右))
• Python2.3到Python2.7:经典类、新式类和平发展
• 从Python2.3开始新式类的MRO取而代之的是C3算法
• Python3到至今:新式类一统江湖
• Python3开始就只存在新式类了,采用的MRO也依旧是C3算法
C3算法
首先将自身类加入本序列,然后堆积成旭烈的元素依次判断
若某元素不在其他序列或者它是所有继承序列的第一个,那么把这个元素提取到本序列
经典类与新式类的继承继承原理
• MRO(Method Resolution Order):方法解析顺序
• MRO是在Python类的多重继承中,解决当定义了多个同名的方法/属性时,为避免产生歧义,保证
用户找到正确的对象所实现的一种算法。
• 对于你定义的每一个类,Python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表
静态属性 --> 类属性
普通属性 --> 实例属性
• 实例(普通)方法(使用实例中的数据)--> 给实例使用(一定要传递一个实例,由实例调用)
• 静态方法(无需使用实例封装的内容@staticmethod)
• 类方法(会自动加当前类的类名 @classmethod) => cls表示类本身
class A:
name = "ATM"
def __init__(self):
self.country = "China"
# 普通方法(实例方法):第一个参数代表实例本身
def narmal_method(self,name):
print("normal:")
print(self.name,name)
# 类方法:第一个参数代表类
@classmethod
def class_method(cls,name):
print("classmethod:")
print(cls)
# 静态方法
@staticmethod
def static_method(name):
print("staticmethod:")
a1 = A()
# 实例方法,静态方法,类方法都能通过实例去调用
a1.narmal_method("a1")
# 输出结果
normal:
ATM a1
a1.class_method("a1")
# 输出结果
classmethod:
a1.static_method("a1")
# 输出结果
staticmethod:
# 类可以通过类名调用类方法和静态方法,类调用实例方法必须传入一个实例对象
A.narmal_method(a1,"A")
# 输出结果
normal:
ATM A
A.class_method("A")
# 输出结果
classmethod:
A.static_method("A")
# 输出结果
staticmethod:
• 实例方法不能通过类名调用,但是静态方法和类方法是可以(不实例化访问)
• 实例方法:可以通过self访问实例属性
• 类方法:可以通过cls访问类属性(希望取的值不受实例影响时使用)
• 静态方法:不可以访问,通过传值的方式
1.实例方法
只能通过实例对象调用,类对象调用的话,需要传递实例作为参数
实例方法内部通过 self.属性名 去访问实例属性和类属性
使用对象调用实例方法时,第1个参数可以不用传,就代表实例本身
2.类方法
可以通过实例调用,也可以通过类去调用,第1个参数代表类本身,可以不用传
可以使用 cls.属性名 去访问类属性
前面要装饰器#classmethod
3.静态方法
可以通过实例对象、类名去调用,但是每个参数都必须必须传递
方法的内部访问属性,通过 类名.属性名 去访问类属性
前面要加装饰器@staticmethod
__init__是实例方法,__new__是静态方法
• 把函数包装成属性,使用的时候用对象名.属性名
• Person类中有一个属性为age,控制age的范围只能在0~150之间
属性包装的应用
• property广泛应用在类的定义中,可以让调用者写出简短的代码,同时保证对参数进行必要的检
查,这样,程序运行时就减少了出错的可能性。
创作不易,客官点个赞吧!评论一下!一起加油❤