面向对象编程之classmethod和staticmethod
classmethod
和 staticmethod
都是python内置的装饰器
classmethod 的作用:给在类内部定义的方法装饰,将类的内部方法变为类的绑定方法
绑定方法的特殊之处是会将对象本省当作第一个参数传入方法中
类的绑定方法:由类来调用,哪个类调用,就默认将哪个类当作第一个参数传入
class DB:
__data = "lee is a big haha!"
def __init__(self, user, pwd):
self.user = user
self.pwd = pwd
# 查看数据方法
# 使用classmethod装饰器 让DB类直接调用check_db()
@classmethod
def check_db(cls, user, pwd):
if user == "dawn" and pwd == "123":
print("校验通过……")
print(cls.__data)
# 一般都是通过创建对象,通过对象.方法() 调用方法
db_obj = DB("lee", "123")
db_obj.check_db("dawn", "123") # 输出结果:校验通过…… lee is a big haha!
# 给类中的check_db()加上classmethod 装饰,让类直接调用看看
DB.check_db("dawn", "123") # 输出结果:校验通过…… lee is a big haha!
staticmethod 的作用:给在类内部定义方法中装饰,将类内部的方法变为非绑定方法
非绑定方法:可以由类或对象来调用。不论是谁调用,方法中有几个参数,就要传入几个传参,跟调用函数的方式一样。
class Demo:
@staticmethod
def func(self):
print(self)
# 创建对象调用func
demo = Demo()
# 理论上,不用传参,但不传参就报错
demo.func(1234) # 输出结果:1234
# 通过类调用func
# 理论上,不用传参,但不传参就报错
Demo.func(2345) # 输出结果:2345
总结:
对象的绑定方法
- 由对象来调用,会将对象当做第一个参数传入给该方法。
- 实现:在类内部定义(封装)一个方法即可
类的绑定方法
- 由类来调用,会将类当做第一个参数传入给该方法。
- 实现:在类内部方法中,使用classmethod装饰器即可
非绑定方法
- 由对象/类来调用,由谁来调用,它都是一个普通函数,内部需要接受几个参数,就得传入几个。
- 实现:在类内部方法中,使用staticmethod装饰器即可