Python 类 以及self.方法、cls.方法与sta.方法的区别

Python类中的各种方法是通过方法的名字调用的函数,通过定义类和对象,将类和对象当做参数传入方法中,进而获得返回值

Python类中的方法是对象与函数的结合体

以下是python类中对对象的初始化函数以及三种方法的定义

class Test(object):
    def __init__(self, title):  #可定义多个参数
        self.title = title
    def get_title(self):   #定义了实例方法
        return self.title
    @classmethod
    def get_time(cls):  #定义了类方法
        print("On July 2")
    @staticmethod
    def get_grade():      #定义了静态方法
        print("89")

在定义一个类的对象时,需要用到 __init__,self为默认命名的参数(可以为其他的字符串)实际为对象的地址,可以理解为保险箱中存放着很多东西,self为保险箱的编号,可以方便的找到自己的保险箱


instance method(需要添加参数“self”)

实例方法的两种调用格式

MS.get_title();  #通过实例调用
Test.get_title(MS)  #通过类的方式调用
In [11]: MS = Test('Molecular system examination')

In [12]: MS.get_title()
Out[12]: 'Molecular system examination'

当我们调用方法get_title时,get_title方法实际是将调用的实例对象MS作为参数self传递了进去,self是参数的名称,不是关键字

总结:1、instance method 就是实例对象与函数的结合。

2、使用类调用,第一个参数明确的传递过去一个实例。

  1. 3、使用实例调用,调用的实例被作为第一个参数被隐含的传递过去。


class method (参数需要添加“cls”)

类方法将类本身当做对象进行操作,在定义类方法时使用@classmethod装饰器定义,其第一个参数是类,约定写为cls。类对象和实例对象都可以调用类方法。

class Test(object):
    time = “On June 2”
    @classmethod
    def get_time(cls):  #定义了类方法
        return cls.time

test_time 是绑定在Test的方法,可以通过类来访问(通过类的实例对象也可以访问,但是传递过去的cls依旧是类)

调用该类函数 :

Test.get_time()
“On June 2”
Human().get_time()
“On June 2”

从上述结果可以看出通过类和类的实例对象均可以访问类方法,但是传递过去的参数,类和实例对象是什么呢?

class Test(object):
    time = “On June 2”
    @classmethod
    def get_time(cls):  #定义了类方法
        print (cls)
Test.get_time()
<class '__main__.Test'> 
Test().get_time()
<class '__main__.Test'>

可以看到传递过去的参数均为Test类,无论所访问的是类还是类的实例对象,所传入的cls参数均为类,cls为函数参数,调用时被隐含的传递进去。

总结:1、classmethod 是类对象与函数的结合。

2、可以使用和类的实例调用,但是都是将类作为隐含参数传递过去。

  1. 3、使用类来调用 classmethod 可以避免将类实例化的开销。

staticmethod

静态方法是一种普通函数,不会对任何类或者对象进行操作。类对象和实例都可以调用静态方法, 

使用装饰器@staticmethod定义静态方法。

class Test(object):
    @staticmethod
    def add(a,b):  #定义了静态方法
        return a + b
    
Test.add
<function __main__.add>

Test().add
<function __main__.add>

Test.add(1,2)
3

Test().add(1,2)
3

可以从上述代码中发现,在类和实例中调用add静态方法时,方法均是一个普通的函数,没有绑定任何一个特定的类或者实例,可以使用类或者类的实例调用,并且没有任何隐含参数的传入。

总结:1、当一个函数逻辑上属于一个类又不依赖与类的属性的时候,可以使用staticmethod。

  1. 2、使用 staticmethod 可以避免每次使用的时都会创建一个对象的开销。
  2. 3、staticmethod 可以使用类和类的实例调用。但是不依赖于类和类的实例的状态。


对三种方法的归纳总结:

方法调用情况访问权限
普通方法可以通过实例来调用可访问实例属性,无法访问类属性
类方法可以通过类名和实例来调用可访问类属性,无法访问实例属性
静态方法可以通过类名和实例来调用无法访问类属性及实例属性(仅可通过传值的方式)

参考资料

https://www.zhihu.com/question/22869546/answer/22933397


版权声明:本文为原创文章,未经博主允许不得转载。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章