当前位置: 首页 > 面试题库 >

classmethod在此代码中做什么?

艾奕
2023-03-14
问题内容

django.utils.tree.py中:

def _new_instance(cls, children=None, connector=None, negated=False):
        obj = Node(children, connector, negated)
        obj.__class__ = cls
        return obj
    _new_instance = classmethod(_new_instance)

我不知道classmethod此代码示例中的功能。有人可以解释它的作用和用法吗?


问题答案:

classmethod 是一个装饰器,包装了一个函数,您可以在类或(等效地)其实例上调用结果对象:

>>> class x(object):
...   def c1(*args): print 'c1', args
...   c1 = classmethod(c1)
...   @classmethod
...   def c2(*args): print 'c2', args
... 
>>> inst = x()
>>> x.c1()
c1 (<class '__main__.x'>,)
>>> x.c2()
c2 (<class '__main__.x'>,)
>>> inst.c1()
c1 (<class '__main__.x'>,)
>>> inst.c2()
c2 (<class '__main__.x'>,)

如您所见,无论是直接定义它还是使用装饰器语法定义它,以及在类或实例上调用它,classmethod总是会将该类作为其第一个参数。

classmethod的主要用途之一是定义 替代构造函数

>>> class y(object):
...   def __init__(self, astring):
...     self.s = astring
...   @classmethod
...   def fromlist(cls, alist):
...     x = cls('')
...     x.s = ','.join(str(s) for s in alist)
...     return x
...   def __repr__(self):
...     return 'y(%r)' % self.s
...
>>> y1 = y('xx')
>>> y1
y('xx')
>>> y2 = y.fromlist(range(3))
>>> y2
y('0,1,2')

现在,如果您子类化y,则类方法将继续工作,例如:

>>> class k(y):
...   def __repr__(self):
...     return 'k(%r)' % self.s.upper()
...
>>> k1 = k.fromlist(['za','bu'])
>>> k1
k('ZA,BU')


 类似资料:
  • 问题内容: 我不太确定这是什么意思或在做什么,有人可以详细说明吗? 问题答案: 它接受发送者引用的对象,并尝试将其转换为Player类型。Java对象是强类型的,这意味着您必须声明对象的类型。 如果发件人引用的对象不能转换为Player对象,则将为InvalidCast抛出异常。

  • 所以我找到了这段代码,我真的很想了解这段代码是如何工作的,以及在里面传递这个值的用法 "( )".

  • 问题内容: 我试图进行搜索并弄清楚它是如何工作的,但是我很难找到一个解释。 如果我的变量类型为() 怎么办?我知道接口可以代表很多事情,但是他在这里发生的事情的高层概述是什么? 问题答案: 这是一个类型断言: 类型断言提供对接口值的基础具体值的访问。 https://tour.golang.org/methods/15 如果该断言不成立,则会引发恐慌。要测试该值是否为特定类型T,可以使用以下命令:

  • 问题内容: 我正在尝试通过查看其代码来复制我进入gmail的邮件程序。我在多个源代码查看器中看到了很多: 3D是否是我不知道的某种邮件渲染方式? 问题答案: 这是一种称为“ quoted-printable ”的电子邮件编码系统,该系统允许将非ASCII字符表示为ASCII以便进行电子邮件传输。 在带引号的可打印格式中,任何非标准的电子邮件八位字节均以一个符号表示,后跟两个十六进制数字,代表该八位

  • 风格: 日志消息:10-10 13:20:01.184:E/AndroidRuntime(1417):致命异常:main 10-10 13:20:01.184:E/AndroidRuntime(1417):android。看法WindowManager$BadTokenException:无法添加窗口--android令牌。应用程序。本地活动管理器$LocalActivityRecord@411e