【问题标题】:How would an instance variable be used in a class method?如何在类方法中使用实例变量?
【发布时间】:2019-02-19 00:17:52
【问题描述】:

有没有一种方法可以在类方法中使用实例变量来执行计算?

非常简单,这是我正在尝试做的:

class Test:

  def __init__(self, a):
    self.a = a

  @classmethod
  def calculate(cls, b):
     return self.a + b

【问题讨论】:

  • 类方法中没有self。您的方法作为普通的实例方法可以很好地工作。为什么要在圆孔中推方钉?即,如果您正在对实例进行计算,为什么您认为应该有一个类方法?您的“非常简化”可能过于简化而无法理解 - 我所看到的只是错误的代码,可以通过删除 @classmethod 并将 cls 替换为 self 来轻松修复。
  • 该方法中应该使用哪个实例的.a?您没有首选的 self 实例,但如果您确实需要,可以将一个实例(或多个实例)作为显式参数传递给类函数。
  • 描述符协议明确允许这样做;点运算符将使用实例和类访问描述符的__get__ 方法。见docs.python.org/3/howto/descriptor.html#functions-and-methods
  • @Amadan 我最初的问题是在类的 init 中实例化一个文件名,然后在类方法中使用该文件名来懒惰地获取一个可用于所有对象实例的 pandas 数据帧一旦打开(以节省内存)

标签: python instance-variables class-method


【解决方案1】:

我只想声明一个变量“a”,然后在类方法中使用它进行计算。

如果你想缓存一个类范围的值,这些是你的基本选项:

显式设置值:

class Foo:
    @classmethod
    def set_foo(cls):
        print('Setting foo')
        cls.foo = 'bar'

    def print_foo(self):
        print(self.__class__.foo)

Foo.set_foo()      # => 'Setting foo'
Foo()
Foo().print_foo()  # => 'bar'

在类初始化时设置值:

class Foo:
    print('Setting foo')
    foo = 'bar'

    def print_foo(self):
        print(self.__class__.foo)
# => 'Setting foo'

Foo()
Foo()
Foo().print_foo()  # => 'bar'

在第一个实例初始化时设置值:

class Foo:
    def __init__(self):
        if not hasattr(self.__class__, 'foo'):
            print('Setting foo')
            self.__class__.foo = 'bar'

    def print_foo(self):
        print(self.__class__.foo)

Foo()              # => 'Setting foo'
Foo()
Foo().print_foo()  # => 'bar'

【讨论】:

    【解决方案2】:

    如果您想要命名空间,请改用 @staticmethod 并让用户传入变量,例如Test.calculate(a, b)

    【讨论】:

    • 我想我的问题可能被误解了,但我想要的只是声明一个变量'a',然后在类方法中使用它进行计算。我认为在我的 init 中我应该只做 Test.a = a.
    猜你喜欢
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 2020-03-15
    相关资源
    最近更新 更多