【问题标题】:What does cls() function do inside a class method?cls() 函数在类方法中做了什么?
【发布时间】:2014-07-17 09:13:31
【问题描述】:

今天我正在查看另一个人的代码,并且看到了这个:

class A(B): 
    # Omitted bulk of irrelevant code in the class

    def __init__(self, uid=None):
        self.uid = str(uid)

    @classmethod
    def get(cls, uid):
        o = cls(uid)
        # Also Omitted lots of code here

cls() 函数在这里做什么?

如果我让其他一些类继承了这个A类,调用它C,当调用这个get方法时,这个o会使用C类作为cls()的调用者吗?

【问题讨论】:

  • cls 在这种情况下是 A

标签: python class


【解决方案1】:

这是一个类工厂。

本质上和调用一样:

o = A(uid)

cls in def get(...): A

【讨论】:

  • 欢迎提出改进的编辑建议。毕竟这是一个社区论坛。
  • 这个答案有大量的预期知识。
【解决方案2】:

cls是构造函数,它将构造A类并调用__init__(self, uid=None)函数。

如果您继承它(使用 C),则 cls 将保留“C”(而不是 A),请参阅 AKX 答案。

【讨论】:

    【解决方案3】:

    对于classmethods,第一个参数是调用类方法的类,而不是instancemethods 的通常self(除非另有说明,否则类中的所有方法都是隐式的)。

    这是一个示例——为了练习,我添加了一个异常来检查 cls 参数的身份。

    class Base(object):
        @classmethod
        def acquire(cls, param):
            if cls is Base:
                raise Exception("Must be called via subclass :(")
            return "this is the result of `acquire`ing a %r with %r" % (cls, param)
    
    class Something(Base):
        pass
    
    class AnotherThing(Base):
        pass
    
    print Something.acquire("example")
    print AnotherThing.acquire("another example")
    print Base.acquire("this will crash")
    

    this is the result of `acquire`ing a <class '__main__.Something'> with 'example'
    this is the result of `acquire`ing a <class '__main__.AnotherThing'> with 'another example'
    Traceback (most recent call last):
      File "classmethod.py", line 16, in <module>
        print Base.acquire("this will crash")
      File "classmethod.py", line 5, in acquire
        raise Exception("Must be called via subclass :(")
    Exception: Must be called via subclass :(
    

    【讨论】:

    • 这并没有真正回答 OP 的问题,即 cls() 在他所看到的 classmethod 中做了什么。正如我所说(除了@classmethods)它是一个工厂。
    猜你喜欢
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    相关资源
    最近更新 更多