python 实例方法 类方法_Python实例方法、类方法和静态方法

Python类的组成主要包含两个部分,类的属性和类的方法。类的属性是对数据的封装,这些数据是用来描述类所抽象的事物的特征;类的方法是用来表示对象的特定行为。Python的类的方法又可以进一步细分为三种不同类型,即实例方法、类方法和静态方法。

这里就是对类的这三种方法进行详细讨论,包括它们是如何实现、如何被调用以及各自的特点。

实例方法

实例方法是你在Python中将会在大多数情况下使用到的最基本、最简单的方法,该方法必须接受一个参数,一般情况下我们将这个参数约定写成self,self参数传入的是类的实例化对象。

实例方法的使用:

定义了一个student类,student类中实现了一个名为get_info实例方法,在get_info实例方法中打印出对象相关信息。

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对象。

可以看出,通过self参数,实例方法可以自由地访问同一对象上的属性和其他方法。当涉及到修改对象的状态时,实例方法就非常给力。

类方法

类方法在Python中使用的比较少,类方法不接受self参数,而是接受一个cls参数,cls参数调用时指向的是类而不是实例对象。通常情况下,类方法使用@classmethod装饰器来修饰。与实例方法不同的是,类方法可以通过类直接调用,也可以通过实例对象直接调用。但无论哪种调用方式,最左侧传入的参数一定是类本身。

(注意cls参数和实例方法self参数一样也是约定写成的,可以使用其它名字代替)

类方法的使用:

使用类方法增加前面定义的student类的功能,让每个student类的对象可以得到当前实例化student对象的个数。

classstudent(object):

total_num=0def __init__(self, _name, _age):

self.name=_name

self.age=_agedef __new__(cls, *args, **kwargs):

cls.set_num()return object.__new__(cls)

@classmethoddefset_num(cls):

cls.total_num+= 1@classmethoddefget_num(cls):returncls.total_numdefget_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个,也就是说类属性属于类而不属于对象。)

类方法实现工厂模式

classstudent(object):def __init__(self, _name, _age):

self.name=_name

self.age=_agedefget_info(self):print('%s is %d years old !' %(self.name, self.age))

@classmethoddeffactory(cls):return cls('init', 10)if __name__ == "__main__":

a=student.factory()

b=student.factory()print(a)print(b)

静态方法

静态方法即不接受self参数,也不接受cls参数,但它可以接受其他任意数量的参数。与类方法一样,静态方法也使用一个装饰器修饰,修饰符为@staticmethod。

由于静态方法不接受self参数和cls参数,静态方法不能修改对象状态和类状态。因此,静态方法主要是用来存放逻辑性的代码,逻辑上属于类,但是和类本身没有关系。可以理解为,静态方法是个独立的、单纯的函数,它仅仅托管于某个类的名称空间中,便于使用和维护。

静态方法的使用:

classstudent(object):def __init__(self, _name, _age):

self.name=_name

self.age=_agedefget_info(self):print('%s is %d years old !' %(self.name, self.age))

@staticmethoddefdo_something(string):print(string)if __name__ == "__main__":

a= student('a', 10)

a.do_something('staticmethod')

静态方法的调用方式和类实例方法的调用方式一样,只是在调用时Python解释器不会将实例对象强制绑定在静态方法的第一个参数上。a.do_something('staticmethod')即静态方法的调用, ‘staticmethod’表示传给静态方法的参数。

小结

实例方法需要实例对象调用,通过self参数访问到该实例。实例方法可以用来修改实例化对象的状态信息。

类方法不能访问到类的实例对象状态,但它可以访问类的属性。类方法可以使用类调用,也可以使用实例直接调用,但传入的类方法左侧的参数是类本身。

静态方法无权访问到self和cls,可以看成是一个独立的、单纯的函数,但它属于类的名称空间中。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值