本系列将会陆续整理分享一些的Python内置函数。
-
通过百度网盘获取:
链接:https://pan.baidu.com/s/11x9_wCZ3yiYOe5nVcRk2CQ?pwd=mnsj
提取码:mnsj
-
前往GitHub获取:
https://github.com/returu/Python_built-in_functions
class C:
@classmethod
def f(cls, arg1, arg2):
...
类方法与实例方法、静态方法的区别:
①实例方法:
第一个参数是self,表示类的实例。
可以访问实例属性和实例方法。
②类方法:
第一个参数是cls,表示类本身。
可以访问类属性和类方法,但不能直接访问实例属性。
③静态方法:
不需要任何特殊参数(既没有self也没有cls)。
不能直接访问类属性或实例属性。
-
在类上调用: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
class DerivedClass(BaseClass):
class_var = "DerivedClass variable"
# 在派生类上调用类方法
DerivedClass.my_class_method()
# 输出: Class method called on DerivedClass
# Class variable: DerivedClass variable
-
__module__:定义该方法的模块名称。 -
__name__:方法的名称。 -
__qualname__:方法的限定名称(包括类名)。 -
__doc__:方法的文档字符串。 -
__annotations__:方法的类型注解。
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'>}
下面是一些使用 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


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