首页Python【Python内置函数】c...

【Python内置函数】classmethod()函数

Python 提供了许多内置函数,这些函数是Python语言的一部分,可以直接在Python程序中使用而无需导入任何模块。

本系列将会陆续整理分享一些的Python内置函数。

文章配套代码获取有以下两种途径:
  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/11x9_wCZ3yiYOe5nVcRk2CQ?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Python_built-in_functions





01
简介

Python中,classmethod是一个内置装饰器,用于将一个方法标记为类方法(class method)。类方法的第一个参数是类本身(习惯上命名为cls),而不是实例(self)。类方法可以访问类属性和类方法,但不能直接访问实例属性。类方法常用于实现工厂方法模式,即根据输入参数返回类的实例。

要声明一个类方法,一般使用以下语法:

class C:    @classmethod    def f(cls, arg1, arg2):        ...
类方法的第一个参数始终是 cls,它指向类本身。还可以传递额外的参数(如 arg1arg2 等)到方法中。

类方法与实例方法、静态方法的区别:

①实例方法:

第一个参数是self,表示类的实例。

可以访问实例属性和实例方法。

②类方法:

第一个参数是cls,表示类本身。

可以访问类属性和类方法,但不能直接访问实例属性。

③静态方法:

不需要任何特殊参数(既没有self也没有cls)。

不能直接访问类属性或实例属性。

类方法可以通过以下两种方式调用:
  • 在类上调用:C.f()
  • 在类的实例上调用:C().f()
当在实例上调用时,实例会被忽略,只使用其实例的类。这意味着C().f()C.f()是等效的。
class BaseClass:
    class_var = "BaseClass variable"

    # 将方法转换为类方法
    @classmethod
    def my_class_method(cls):
        print(f"Class method called on {cls.__name__}")
        print(f"Class variable: {cls.class_var}")
        
# 通过类调用
BaseClass.my_class_method()
# 输出: Class method called on BaseClass
#      Class variable: BaseClass variable

# 通过实例调用
obj = BaseClass()
obj.my_class_method()
# 输出: Class method called on BaseClass
#      Class variable: BaseClass variable
如果在派生类上调用类方法,会将派生类对象作为隐式的第一个参数(cls)传递。这种行为使得类方法可以动态地识别调用它的类,无论是基类还是派生类。
class DerivedClass(BaseClass):
    class_var = "DerivedClass variable"

# 在派生类上调用类方法
DerivedClass.my_class_method()
# 输出: Class method called on DerivedClass
#      Class variable: DerivedClass variable
在 Python 3.10 及更高版本中,类方法会继承以下方法属性:
  • __module__:定义该方法的模块名称。
  • __name__:方法的名称。
  • __qualname__:方法的限定名称(包括类名)。
  • __doc__:方法的文档字符串。
  • __annotations__:方法的类型注解。
这些属性的继承使得类方法在行为上更加接近普通方法,同时也便于在运行时获取更多关于方法的信息。

另外,新增了 __wrapped__ 属性,指向原始的函数对象。

class MyClass:
    @classmethod
    def my_class_method(cls, x: int) -> str:
        """This is a class method."""
        return f"Class: {cls.__name__}, Value: {x}"

# 访问类方法的方法属性
print(MyClass.my_class_method.__module__)       # 输出: __main__
print(MyClass.my_class_method.__name__)         # 输出: my_class_method
print(MyClass.my_class_method.__qualname__)     # 输出: MyClass.my_class_method
print(MyClass.my_class_method.__doc__)          # 输出: This is a class method.
print(MyClass.my_class_method.__annotations__)  # 输出: {'x': <class 'int'>, 'return': <class 'str'>}


02
使用

下面是一些使用 classmethod 的使用示例:

  • 示例 1:使用类方法实现工厂方法

类方法常用于实现工厂方法模式,即根据输入参数返回类的实例。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @classmethod
    def from_birth_year(cls, name, birth_year):
        # 根据当前年份计算年龄
        current_year = 2023
        age = current_year - birth_year
        return cls(name, age)  # 创建并返回一个新的实例

# 使用类方法创建实例
person = Person.from_birth_year("Alice", 1990)
print(person.name, person.age)  # 输出: Alice 33

本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments