繁体   English   中英

这个简单的python元类有什么问题?

[英]What is wrong with this simple python metaclass?

Digression开始

我刚学会了Python中的元类。 我不认为python的创建者希望每个人都使用它们。 我的意思是名字,在大多数情况下可能不是一个类的元类足以让大多数人远离这个概念!

题外话题结束

关于我的问题。 我编写了这个简单的元类来为模块中创建的所有类添加默认的文档字符串。 但它不起作用:

def metest(cls,name,bases,dict):
    cls.setattr(cls,'__doc__',"""Default Doc""")
    return type(cls,(),{})

__metaclass__=metest

class test(object):
    pass

print test.__doc__

t=test()

print t.__doc__

输出:

None
None

我究竟做错了什么?

我并不完全熟悉你正在做的全局方法,像这样设置__metaclass__ 据我所知,它是另一种有效的风格。

但我会提供一个我熟悉的例子:

class MeTest(type):
    def __new__(cls,name,bases,dict):
        dict['__doc__'] = """Default Doc"""
        return type.__new__(cls,name,bases,dict)

class Test(object):
    __metaclass__ = MeTest

我让你的例子工作:

def metest(name, bases, dict):
    print name, bases, dict
    dict['__doc__'] = """New Doc"""
    cls = type(name+"_meta", bases, dict)
    return cls

class Test(object):
    "Old doc"
    __metaclass__ = metest

print Test
print Test.__doc__

t = Test()

print t.__doc__
  1. 使用“元类”。
  2. 更正“类创建功能”的签名。 cls将由我们创建。
  3. 有一个“旧”和“新”文档字符串,以区分。

看到这个答案: Python元类和对象基类

提供object基类会覆盖模块级元类,并将其替换为typeobject的元类)。

此外,您的元类错误,即使您将其应用(通过在类中设置__metaclass__ )也无法工作。 它应该只接受三个论点。 您通常会看到接受四个的示例,但这是因为元类通常是猜测一个 ,所以它接受一个额外的“自我”参数(按照惯例,它被称为元类的cls )。

可能这就是你想要的。 object继承将使元类type ,因此如果要使用全局元类,则不能这样做

def metest(name, bases, dct):
    dct['__doc__'] = """Default Doc"""
    return type(name, bases, dct)

__metaclass__=metest

class test:
    pass

print test.__doc__

t=test()

print t.__doc__

正如BrenBarn所述,您的模块级元类被覆盖。 instead of setting it as a class instance. 要解决此问题,请尝试对其进行编码以而不是将其设置为类实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM