【问题标题】:How to reference the class itself in python [duplicate]如何在python中引用类本身[重复]
【发布时间】:2013-04-16 11:25:13
【问题描述】:

我想在 python 中有这样的简单类常量:

class FooBarBaz:
    BAR = 123

    @staticmethod
    def getBar():
        return BAR # this would not work, of course

        return FooBarBaz.BAR # this would work but is "way too long"

有没有更短的方法从方法内部引用类本身,而不是当前实例?它不仅适用于静态方法,而且通常适用于 __class__ 关键字或其他东西。

【问题讨论】:

  • 我猜你正在寻找类方法,而不是静态。
  • @thg435 nvm 好点。提交作为答案...
  • 忘记它是否是静态的。我正在从类范围中寻找类本身的通用别名,而不是实例(如果有的话)。它可以是属于类的变量,属于类的方法。我想要self 之类的东西引用类的实例,但引用类。
  • 你的意思是type(self)
  • 在classmethods中传递给函数的第一个参数是class(通常表示为cls)docs.python.org/2/library/functions.html#classmethod

标签: python


【解决方案1】:

您需要@classmethod 而不是@staticmethod - 类方法将获得对该类的引用(其中方法将获得self),因此您可以在其上查找属性。

class FooBarBaz:
    BAR = 123

    @classmethod
    def getBar(cls):
        return cls.BAR

【讨论】:

    【解决方案2】:

    其实python 3中有__class__

    Python 3.2.3 (v3.2.3:3d0686d90f55, Apr 10 2012, 11:25:50) 
    [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> class A:
    ...     @staticmethod
    ...     def foo():
    ...         print(__class__)
    ... 
    >>> A.foo()
    <class '__main__.A'>
    >>> 
    

    请参阅http://www.python.org/dev/peps/pep-3135 了解添加它的理由。

    不知道如何在 py2 中实现同样的效果,我猜是 this is not possible

    【讨论】:

    • 好点。我使用的是 2.7,所以我接受了我在代码中实际使用的另一个答案。
    • @Veseliq:嗯?你说你不是在寻找类方法?
    • 查看cmets,我其实不知道@classmethod是什么:)
    • @Veseliq:啊,那好吧。但是请注意,cls__class__ 完全不同 - 它不会告诉您方法的定义位置,只会告诉您如何调用它。
    猜你喜欢
    • 2012-12-14
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 2015-04-04
    • 2011-08-16
    • 1970-01-01
    • 2020-12-07
    • 2021-07-05
    相关资源
    最近更新 更多