Python | 经典类与新式类,静态方法、类方法与实例方法详解!

创作不易,来了的客官点点关注,收藏,订阅一键三连❤😜 

前言

“人生苦短,我用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)

<type 'instance'>

新式类

类实例的类型是这个实例所创建自的类(通常是和类实例的__class__相同

>>> class A: pass

...

>>> a = A()

>>> type(a)

<class '__main__.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:

<class '__main__.A'>



a1.static_method("a1")

# 输出结果

staticmethod:



# 类可以通过类名调用类方法和静态方法,类调用实例方法必须传入一个实例对象



A.narmal_method(a1,"A")

# 输出结果

normal:

ATM A



A.class_method("A")

# 输出结果

classmethod:

<class '__main__.A'>



A.static_method("A")

# 输出结果

staticmethod:

各种方法的区别(@staticmethod、@classmethod)

• 实例方法不能通过类名调用,但是静态方法和类方法是可以(不实例化访问)

• 实例方法:可以通过self访问实例属性

• 类方法:可以通过cls访问类属性(希望取的值不受实例影响时使用)

• 静态方法:不可以访问,通过传值的方式

总结

1.实例方法

  只能通过实例对象调用,类对象调用的话,需要传递实例作为参数

  实例方法内部通过 self.属性名 去访问实例属性和类属性

  使用对象调用实例方法时,第1个参数可以不用传,就代表实例本身

2.类方法

  可以通过实例调用,也可以通过类去调用,第1个参数代表类本身,可以不用传

  可以使用 cls.属性名 去访问类属性

  前面要装饰器#classmethod

3.静态方法

  可以通过实例对象、类名去调用,但是每个参数都必须必须传递

  方法的内部访问属性,通过 类名.属性名 去访问类属性

  前面要加装饰器@staticmethod

__init__是实例方法,__new__是静态方法

属性包装与应用(@propert)

• 把函数包装成属性,使用的时候用对象名.属性名

• Person类中有一个属性为age,控制age的范围只能在0~150之间

属性包装的应用

• property广泛应用在类的定义中,可以让调用者写出简短的代码,同时保证对参数进行必要的检

查,这样,程序运行时就减少了出错的可能性。

创作不易,客官点个赞吧!评论一下!一起加油❤😜

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chaochao️

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值