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、使用类调用,第一个参数明确的传递过去一个实例。
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()
Test().get_time()
可以看到传递过去的参数均为Test类,无论所访问的是类还是类的实例对象,所传入的cls参数均为类,cls为函数参数,调用时被隐含的传递进去。
总结:1、classmethod 是类对象与函数的结合。
2、可以使用和类的实例调用,但是都是将类作为隐含参数传递过去。
staticmethod
静态方法是一种普通函数,不会对任何类或者对象进行操作。类对象和实例都可以调用静态方法,
使用装饰器@staticmethod定义静态方法。
class Test(object):
@staticmethod
def add(a,b): #定义了静态方法
return a + b
Test.add
Test().add
Test.add(1,2)
3
Test().add(1,2)
3
可以从上述代码中发现,在类和实例中调用add静态方法时,方法均是一个普通的函数,没有绑定任何一个特定的类或者实例,可以使用类或者类的实例调用,并且没有任何隐含参数的传入。
总结:1、当一个函数逻辑上属于一个类又不依赖与类的属性的时候,可以使用staticmethod。
对三种方法的归纳总结:
方法 | 调用情况 | 访问权限 |
普通方法 | 可以通过实例来调用 | 可访问实例属性,无法访问类属性 |
类方法 | 可以通过类名和实例来调用 | 可访问类属性,无法访问实例属性 |
静态方法 | 可以通过类名和实例来调用 | 无法访问类属性及实例属性(仅可通过传值的方式) |
参考资料
https://www.zhihu.com/question/22869546/answer/22933397
版权声明:本文为原创文章,未经博主允许不得转载。