Python类的组成主要包含两个部分,类的属性和类的方法。类的属性是对数据的封装,这些数据是用来描述类所抽象的事物的特征;类的方法是用来表示对象的特定行为。Python的类的方法又能够进一步细分为三种不一样类型,即实例方法、类方法和静态方法。函数
这里就是对类的这三种方法进行详细讨论,包括它们是如何实现、如何被调用以及各自的特色。spa
实例方法code
实例方法是你在Python中将会在大多数状况下使用到的最基本、最简单的方法,该方法必须接受一个参数,通常状况下咱们将这个参数约定写成self,self参数传入的是类的实例化对象。对象
实例方法的使用:blog
定义了一个student类,student类中实现了一个名为get_info实例方法,在get_info实例方法中打印出对象相关信息。get
class student(object): def __init__(self, _name, _age): self.name = _name self.age = _age def get_info(self): print('%s is %d years old !' %(self.name, self.age))
if __name__ == '__main__':
s = student('LiMing', 12)
s.get_info()
s是使用student类实例化的对象,类的实例方法经过 s.get_info() 方式被调用。在调用实例方法时,s实例对象会被自动的做为参数传给get_info中的第一个self参数中,self也就表明s对象。string
能够看出,经过self参数,实例方法能够自由地访问同一对象上的属性和其余方法。当涉及到修改对象的状态时,实例方法就很是给力。it
类方法class
类方法在Python中使用的比较少,类方法不接受self参数,而是接受一个cls参数,cls参数调用时指向的是类而不是实例对象。一般状况下,类方法使用@classmethod装饰器来修饰。与实例方法不一样的是,类方法能够经过类直接调用,也能够经过实例对象直接调用。但不管哪一种调用方式,最左侧传入的参数必定是类自己。object
(注意cls参数和实例方法self参数同样也是约定写成的,可使用其它名字代替)
类方法的使用:
使用类方法增长前面定义的student类的功能,让每一个student类的对象能够获得当前实例化student对象的个数。
class student(object): total_num = 0 def __init__(self, _name, _age): self.name = _name self.age = _age def __new__(cls, *args, **kwargs): cls.set_num() return object.__new__(cls) @classmethod def set_num(cls): cls.total_num += 1 @classmethod def get_num(cls): return cls.total_num def get_info(self): print('%s is %d years old !' %(self.name, self.age))
if __name__ == "__main__": a = student('a', 10)
print(a.get_num()) b = student('b', 10) print(b.get_num())
新的student类中引入的类属性total_num,重写了__new__方法,使得在每次建立一个实例对象时能调用类方法set_num让类属性total_num加一,total_num表明当前实例化student个数。set_num和get_num都是类方法,它只能访问到类属性。
(类属性和实例属性有所不一样,无论建立了多少类对象,他们的类属性只有1个,也就是说类属性属于类而不属于对象。)
类方法实现工厂模式
class student(object): def __init__(self, _name, _age): self.name = _name self.age = _age def get_info(self): print('%s is %d years old !' %(self.name, self.age)) @classmethod def factory(cls): return cls('init', 10) if __name__ == "__main__": a = student.factory() b = student.factory() print(a) print(b)
静态方法
静态方法即不接受self参数,也不接受cls参数,但它能够接受其余任意数量的参数。与类方法同样,静态方法也使用一个装饰器修饰,修饰符为@staticmethod。
因为静态方法不接受self参数和cls参数,静态方法不能修改对象状态和类状态。所以,静态方法主要是用来存放逻辑性的代码,逻辑上属于类,可是和类自己没有关系。能够理解为,静态方法是个独立的、单纯的函数,它仅仅托管于某个类的名称空间中,便于使用和维护。
静态方法的使用:
class student(object): def __init__(self, _name, _age): self.name = _name self.age = _age def get_info(self): print('%s is %d years old !' %(self.name, self.age)) @staticmethod def do_something(string): print(string) if __name__ == "__main__": a = student('a', 10) a.do_something('staticmethod')
静态方法的调用方式和类实例方法的调用方式同样,只是在调用时Python解释器不会将实例对象强制绑定在静态方法的第一个参数上。a.do_something('staticmethod')即静态方法的调用, ‘staticmethod’表示传给静态方法的参数。
小结