实例方法
一般,类中最常用的方法是实例方法, 即通过实例作为第一个参数的方法,要使用该方法,需要先实例化一个对象再调用方法。
注:实例方法第一个参数需要是表示自身实例对象的self参数。
class Person(object):
def __init__(self, name):
self.name = name
def say_name(self):
print("My name is {}".format(self.name))
xm = Person("xiaoming")
xm.say_name()
输出
My name is xiaoming
类方法(@classmethod)
若我们想写一仅仅与类交互,而不是和实例交互的方法呢?
我们可以在类外面写一个方法来实现,但是这样做就扩散了类代码的关系到类定义的外面,会导致以后代码维护的困难:
def get_number_of_instances(cls):
return cls.num
class Person(object):
num = 0
def __init__(self, name):
self.name = name
Person.num += 1
xm = Person("xiaoming")
xh = Person("xiaohong")
get_number_of_instances(Person)
输出
2
装饰器@classmethod可以实现在类内定义,只与类交互,不与实例交互的类方法。在可以通过实例来调用该方法外,也可以不需要实例化,直接通过类名.方法名()来调用。
这样有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁
注:类方法第一个参数需要是表示自身类的cls参数。
class Person(object):
num = 0
def __init__(self, name):
self.name = name
Person.num += 1
@classmethod
def get_number_of_instances(cls): # 第一个参数需要是表示自身类的cls参数
return cls.num
xm = Person("xiaoming")
xm.get_number_of_instances()
xh = Person("xiaohong")
Person.get_number_of_instances()
输出
2
静态方法(@staticmethod)
有时我们需要跟类有关系的功能,但在运行时又不需要跟类和实例产生交互,跟普通函数一样,比如更改环境变量或修改其他类的属性等。我们可以通过直接在类外定义函数解决,但这同样会扩散类内部的代码,造成维护困难,此时我们可以用静态方法,即@staticmethod。
注:不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名,但此时可以用@classmethod,来避免硬编码。
class Person(object):
num = 0
def __init__(self, name):
self.name = name
Person.num += 1
def say_name(self): # 第一个参数需要是表示自身实例对象的self参数
print("My name is {}".format(self.name))
@classmethod
def get_number_of_instances(cls): # 第一个参数需要是表示自身类的cls参数
return cls.num
@staticmethod
def smethod():
print("****smethod****")
xm = Person("xiaoming")
xm.smethod()
xm.get_number_of_instances()
xh = Person("xiaohong")
Person.smethod()
Person.get_number_of_instances()
输出
****smethod****
1
****smethod****
2