2024-04-24 00:23:56 发布
网友
正在阅读python标准库。试图理解类方法。在
class C: @classmethod def f(x,y): print('words')
当我键入:
它返回:
<classmethod object at 0x00FAD930>
如何看到类方法返回什么而不是类方法的生成器?在
如果要调用在^{上创建的classmethodf,则应执行以下操作:
classmethod
f
C.f(...)
^{}是decorator函数,它将包装传递给它的任何内容并返回一个classmethod object:
classmethod object
注意,classmethod的第一个是类本身,按照惯例称为cls:
cls
class C: @classmethod def f(cls, x, y): print("words")
这样可以得到:
>>> C.f(1, 2) words
或者return值和print在函数之外:
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在用它装饰方法时实际存储在类中的内容。在
C
请记住,函数或类上面的@decorator_expression行只是替换该对象的额外函数调用的语法糖分;@classmethod上面的def f(...)只是意味着Python将用f = classmethod(f)替换{}。在
@decorator_expression
@classmethod
def f(...)
f = classmethod(f)
在查看C.__dict__['f']值时,可以看到相同类型的对象;这是相同类型的对象:
C.__dict__['f']
当您尝试访问C.f属性时,将调用descriptor对象上的__get__方法。在
C.f
__get__
函数本身也是描述符;classmethod绕过函数的.__get__方法来提供对类的绑定,而不是对实例的常规绑定。在
.__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.f()
C().f()
f()
将其与C.regular()方法相比较;这是一个普通方法,当直接用C.regular()在类上调用时,没有传入任何参数,当用C().regular()调用一个实例时,会传入第一个参数,即实例。这就是通常在方法签名中使用self的原因。在
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的值在正在创建的所有不同对象之间共享,而不仅仅限于一个实例
如果要调用在^{上创建的
classmethod
f
,则应执行以下操作:^{} 是decorator函数,它将包装传递给它的任何内容并返回一个
^{pr2}$classmethod object
:注意,
classmethod
的第一个是类本身,按照惯例称为cls
:这样可以得到:
或者
return
值和print
在函数之外:您正在生成
classmethod
描述符对象:返回包装在新的
classmethod
对象中的类C
。这不是一个生成器,这是Python在用它装饰方法时实际存储在类中的内容。在请记住,函数或类上面的}。在
@decorator_expression
行只是替换该对象的额外函数调用的语法糖分;@classmethod
上面的def f(...)
只是意味着Python将用f = classmethod(f)
替换{在查看
^{pr2}$C.__dict__['f']
值时,可以看到相同类型的对象;这是相同类型的对象:当您尝试访问
C.f
属性时,将调用descriptor对象上的__get__
方法。在函数本身也是描述符;
classmethod
绕过函数的.__get__
方法来提供对类的绑定,而不是对实例的常规绑定。在请参阅descriptor HOWTO以了解什么是描述符,以及
classmethod
对象是如何工作的。在要查看方法本身返回的内容,只需在类或实例上调用它:
{cd15>而不是通常传递给类的引用。对于
C.f()
调用(直接在类上)和C().f()
(在C
的实例上)而言,f()
的第一个参数是C
本身。在将其与
C.regular()
方法相比较;这是一个普通方法,当直接用C.regular()
在类上调用时,没有传入任何参数,当用C().regular()
调用一个实例时,会传入第一个参数,即实例。这就是通常在方法签名中使用self
的原因。在对于类方法,在声明方法时,第一个参数通常命名为
cls
。在在创建的所有不同对象之间共享值时,classmethod非常有用。在
在这里,变量a的值在正在创建的所有不同对象之间共享,而不仅仅限于一个实例
相关问题 更多 >
编程相关推荐