@staticmethod和@classmethod的用法

实例方法

一般,类中最常用的方法是实例方法, 即通过实例作为第一个参数的方法,要使用该方法,需要先实例化一个对象再调用方法。
注:实例方法第一个参数需要是表示自身实例对象的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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值