我想确认我是否正确理解了静态方法和类方法。如果我们将方法包装在装饰器
@staticmethod中,那么声明的方法将不适用于我们声明它的类以及我们创建它的对象,问题是,这是否意味着我可以将这个方法写成一个函数在模块范围内?如果您将方法包装在 decorator
@classmethod中,那么当调用时,据我所知,它将影响基于此类创建的所有对象。好吧,例如,假设有一个 count 字段可以计算创建对象的总数,还是我没有理解所有内容?
我想确认我是否正确理解了静态方法和类方法。如果我们将方法包装在装饰器@staticmethod中,那么声明的方法将不适用于我们声明它的类以及我们创建它的对象,问题是,这是否意味着我可以将这个方法写成一个函数在模块范围内?
如果您将方法包装在 decorator@classmethod中,那么当调用时,据我所知,它将影响基于此类创建的所有对象。好吧,例如,假设有一个 count 字段可以计算创建对象的总数,还是我没有理解所有内容?
不同之处在于将作为附加参数隐式传递给方法的值。
method1不会传递任何额外内容,只会传递method2实例对应的类(A),并传递method3实例本身(a)。由于前两个方法不是实例绑定的,因此也可以代表一个类调用它们。
如果尝试这样调用
method3,会报错在这种情况下,您需要明确指定实例
如果使用修饰的方法
classmethod被继承,则继承的类将作为参数传递给它。它与用 装饰的方法有什么区别
staticmethod,后者对代表哪个(或代表谁的实例)调用它的特定类一无所知。更新
例如,有一个类
我们的任务是自动将所有创建的类实例保存到一个列表中,随后能够得到这个列表。作为第一个近似值,我们得到以下解决方案:
这里
get_instances它是代表一个实例调用的,这要归功于 decoratorstaticmethod。没有它并代表类手动调用方法是可能的type(self).get_instances(),但是使用装饰器,代码会变得更简单。当班级继承人出现时,问题就开始了
B没有自己的实例列表,只显示父级。实例也添加在那里B。让我们用字典替换列表来重写解决方案
(Класс, Список)。现在一切正常,但是在每个孩子中,您需要覆盖方法
get_instances,这会导致重复并增加犯错的机会。这里来救援classmethod现在任何子类都有自己的实例列表,维护这些列表的所有逻辑都只在基类中描述。