MyClass.attr文件VS type(self).attr VS separate@classmethod

2024-04-26 03:23:35 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我的类中有一个(正常绑定)方法,它必须访问类变量(比如__init__中的计数器)。如果我想修改类变量,有三种可能:

  1. 使用type(self)self.__class__(在阅读了this之后,我选择了type而不是__class__,因为我使用的是python3,所以“旧式”类不适用)
  2. 使用类的名称。除非这个名字叫反弹,否则这个方法很有效。你知道吗
  3. 专门为更改类变量编写一个@classmethod。这是最复杂,但也是最明确的方法(IMO)。你知道吗

这三种方法是这样写的:

class MyClass:
    counter = 0

    def f1(self):
        type(self).counter += 1

    def f2(self):
        MyClass.counter += 1

    def f3(self):
        self._count()
    @classmethod
    def _count(cls):
        cls.counter += 1

是否有一个明确的“最佳”选项,是哪一个?或者它们或多或少都是等价的,只是“我最喜欢的”选项?继承会改变什么吗?


Tags: 方法selfinitdeftype选项countcounter
1条回答
网友
1楼 · 发布于 2024-04-26 03:23:35

如果从定义变量的类派生出类(可能是赋值给它的方法),则使用type(self)将属性(新值)存储在对象的实际类上。这可能非常有用,但在您的示例中是surely wrong。你知道吗

使用类方法是一样的,只是子类可以重写方法:这可能会使复杂的情况起作用,但不会修复简单的继承情况。你知道吗

使用类名是一个简单的,惯用的答案,避免了子类的混淆。如果不担心重新绑定该名称,那么即使没有任何继承,这也应该是默认值。如果这是一个问题,您可以用两种不同的方式隐藏类对象:

class A:
  counter=0

  # use the magic behind super():
  def _count1(): __class__.counter+=1

  # inject the class object:
  @staticmethod
  def _count2(cls): cls.counter+=1
A._count2.__defaults__=A,

# inject via a closure:
def capture(cls):
  def _count(): cls.counter+=1
  return _count
A._count3=staticmethod(capture(A))

__class__技巧当然可以直接使用,不需要包装器方法,但是它有点难看;在内部,它与上一种方法非常相似。一件不起作用的事情是试图创建一个引用类的字典的函数,因为这些函数是出于优化的原因而受到保护的。你知道吗

相关问题 更多 >