Python类方法()

2024-04-24 00:23:56 发布

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

正在阅读python标准库。试图理解类方法。在

class C:
    @classmethod
    def f(x,y):
        print('words')

当我键入:

^{pr2}$

它返回:

<classmethod object at 0x00FAD930>

如何看到类方法返回什么而不是类方法的生成器?在


Tags: 方法标准键入objectdefatclasswords
3条回答

如果要调用在^{上创建的classmethodf,则应执行以下操作:

C.f(...)

^{}是decorator函数,它将包装传递给它的任何内容并返回一个classmethod object

^{pr2}$

注意,classmethod的第一个是类本身,按照惯例称为cls

class C:
    @classmethod
    def f(cls, x, y):
        print("words")

这样可以得到:

>>> C.f(1, 2)
words

或者return值和print在函数之外:

class C:
    @classmethod
    def f(cls, x, y):
        return "words"

>>> print(C.f(1, 2))
words

您正在生成classmethod描述符对象:

print(classmethod(C))

返回包装在新的classmethod对象中的类C。这不是一个生成器,这是Python在用它装饰方法时实际存储在类中的内容。在

请记住,函数或类上面的@decorator_expression行只是替换该对象的额外函数调用的语法糖分;@classmethod上面的def f(...)只是意味着Python将用f = classmethod(f)替换{}。在

在查看C.__dict__['f']值时,可以看到相同类型的对象;这是相同类型的对象:

^{pr2}$

当您尝试访问C.f属性时,将调用descriptor对象上的__get__方法。在

函数本身也是描述符;classmethod绕过函数的.__get__方法来提供对类的绑定,而不是对实例的常规绑定。在

请参阅descriptor HOWTO以了解什么是描述符,以及classmethod对象是如何工作的。在

要查看方法本身返回的内容,只需在类或实例上调用它:

>>> class C:
...     @classmethod
...     def f(*args, **kw):
...         return args, kw
...     def regular(*args, **kw):
...         return args, kw
... 
>>> C.f()
((<class '__main__.C'>,), {})
>>> C().f()
((<class '__main__.C'>,), {})
>>> C.regular()
((), {})
>>> C().regular()
((<__main__.C object at 0x1085b0790>,), {})

{cd15>而不是通常传递给类的引用。对于C.f()调用(直接在类上)和C().f()(在C的实例上)而言,f()的第一个参数是C本身。在

将其与C.regular()方法相比较;这是一个普通方法,当直接用C.regular()在类上调用时,没有传入任何参数,当用C().regular()调用一个实例时,会传入第一个参数,即实例。这就是通常在方法签名中使用self的原因。在

对于类方法,在声明方法时,第一个参数通常命名为cls。在

在创建的所有不同对象之间共享值时,classmethod非常有用。在

class Classtest:
    a =10
    @classmethod
    def hi(cls, x):
        cls.a= cls.a+x
        print cls.a

h = Classtest()
h.hi(10)

b = Classtest()
b.hi(30)

c = Classtest()
c.hi(40)

>>> ================================ RESTART     ================================
>>>  
20
50
90

在这里,变量a的值在正在创建的所有不同对象之间共享,而不仅仅限于一个实例

相关问题 更多 >