【问题标题】:python class static method dynamic binding static data memberpython类静态方法动态绑定静态数据成员
【发布时间】:2014-10-10 19:12:43
【问题描述】:

我真的不知道如何描述这个问题足够好。所以我认为一个例子更具表现力:

class A:
    c=1
    @staticmethod
    def b(): return A.c

class B(A):
    c=2

我希望B.b() 返回2。但事实并非如此。我将以何种方式实现它?非常感谢。

【问题讨论】:

  • 如果要访问类属性,为什么要使用静态方法而不是类方法?
  • 天哪。我的脑子里一定有枪!

标签: python static-methods static-members


【解决方案1】:

问题是您使用的是staticmethod,并对A 类进行硬编码,而不是使用classmethod,并使用cls 参数。

试试这个:

class A:
    c=1
    @classmethod
    def b(cls): return cls.c

文档(上面链接)解释了差异,但您可能想尝试查看 Stack Overflow 问题,如 What is the difference between @staticmethod and @classmethod in Python 以进行更深入的讨论。简而言之:staticmethod 基本上只是类命名空间内的全局函数,而classmethod 是类对象上的方法;如果您想使用任何类属性(或类本身,如在备用构造函数惯用语中),则需要后者。

【讨论】:

    【解决方案2】:

    您必须使用类方法,以便动态引用该类。您当前使用的静态方法未绑定到任何类,因此您必须照原样静态显式引用 A 类。

    class A(object):
        c = 1
        @classmethod
        def b(cls):
            return cls.c
    
    class B(A):
        c = 2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-31
      • 2013-08-25
      • 2020-02-27
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多