如何在我的所有类中应用元类而不在类声明中对其进行硬编码

斯蒂法诺·萨里奥里(Stefano Sarioli)

对于一次考试,教授要求我编写一个对项目中的所有类都有效的元类,而不必直接在类声明中声明它,这可能吗?如何?例如我有以下代码:

class MetaOne(type): 
    def __new__(meta, classname, supers, classdict):
        print('In MetaOne.new: ', classname, supers, classdict, sep='\n...') 
        return type.__new__(meta, classname, supers, classdict) 
    def __init__(Class, classname, supers, classdict): 
        print('In MetaOne init:', classname, supers, classdict, sep='\n...') 
        print('...init class object:', list(Class.__dict__.keys()))

class Eggs: pass 

print('making class') 

class Spam(Eggs): 
    data = 1 
    def meth(self, arg): pass 

print('making instance') 
X = Spam() 
print('data:', X.data)

我希望输出等于以下代码的输出:

class MetaOne(type): 
    def __new__(meta, classname, supers, classdict):
        print('In MetaOne.new: ', classname, supers, classdict, sep='\n...') 
        return type.__new__(meta, classname, supers, classdict) 
    def __init__(Class, classname, supers, classdict): 
        print('In MetaOne init:', classname, supers, classdict, sep='\n...') 
        print('...init class object:', list(Class.__dict__.keys()))

class Eggs: pass 

print('making class') 

class Spam(Eggs, metaclass=MetaOne): 
    data = 1 
    def meth(self, arg): pass 

print('making instance') 
X = Spam() 
print('data:', X.data)

即使我没有直接声明它,元类也将应用于我的所有类。我对元类有很多疑问,但是最后在定义类时,总是使用metaclass = meta声明。

道格拉斯·登哈托格(Douglas Denhartog)

好吧,我很难理解您的问题。

如果Eggs继承MetaOneSpam继承Eggs,这是否完成了您要尝试执行的操作?

范例1:

class MetaOne(metaclass=ABCMeta):
    pass

class Eggs(MetaOne):
    pass

class Spam(Eggs):
    pass

范例2:

也许lgiordani.com上的可用信息对您有用,尤其是前一链接中的以下代码块:

class FilterClass(type):
    @classmethod
    def __prepare__(name, bases, **kwds):
        return collections.OrderedDict()

    def __new__(metacls, name, bases, namespace, **kwds):
        result = type.__new__(metacls, name, bases, dict(namespace))
        result._filters = [
            value for value in namespace.values() if hasattr(value, '_filter')]
        return result

此代码块演示了如何在不使用的情况下创建元类metaclass=ABCMeta

范例3:

你熟悉super()吗?

class MetaOne:
    def __init__(self, name):
        self.name = name

class Eggs: pass

class Spam(MetaOne, Eggs):
    def __init__(self, name, is_tasty):
        super().__init__(name)
        self.is_tasty = is_tasty

>>> s = Spam('meta', True)
>>> s
<__main__.Spam object at 0x100705b38>
>>> s.name
'meta'
>>> s.is_tasty
True

虽然使用super()不是真正的元类

范例4:

根据您的Python版本,您也许可以__metaclass__ = MetaOne在模块级别进行定义,这将影响该声明下的所有类。

class MetaOne: pass

class Eggs: pass

__metaclass__ = MetaOne

class Spam: pass
class Scrambled: pass
class Fried: pass

在此用例中SpamScrambled的元类Fried将全部是MetaOne

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将元类应用于我的所有类而无需在类声明中对其进行硬编码

来自分类Dev

如何在不进行硬编码的情况下获取C ++中类数组的长度?

来自分类Dev

如何在Docker容器上配置环境变量而不在Dockerfile中对其进行硬编码?

来自分类Dev

如何在我的元类中获取班级的父类?

来自分类Dev

Class.getSimpleName()与在Java中对类名进行硬编码?

来自分类Dev

Class.getSimpleName()与在Java中对类名进行硬编码?

来自分类Dev

我如何在c ++中稍后转发类的声明并使用其成员函数?

来自分类Dev

如何避免每个类中的硬编码WebClient重试时间

来自分类Dev

如何在线性分类器中应用类权重进行二元分类?

来自分类Dev

如何在我的结构中声明一个类?

来自分类Dev

如何访问子类中的变量而不在getter的父类中对其进行初始化

来自分类Dev

像在Eclipse中那样进行编码(而非调试)时,如何在Xcode中查看类中所有变量和方法的列表?

来自分类Dev

如何在Java Nashorn中声明类?

来自分类Dev

如何在类函数中声明const

来自分类Dev

如何在继承的类中自动声明类实例变量

来自分类Dev

打字稿定义:如何在类中声明类

来自分类Dev

如何在不对所有模型进行验证的情况下重用模型中的类

来自分类Dev

如何从我的验证器类中消除所有“if”语句

来自分类Dev

如何在ruby类中获取所有实例变量?

来自分类Dev

如何在Dart中获取类的所有子类?

来自分类Dev

如何在Swift中列出所有符合协议的类?

来自分类Dev

如何在通用Lisp中获取类的所有实例?

来自分类Dev

如何在所有没有JS或JQ中的类的表上添加类?

来自分类Dev

(C ++)如果我在类中声明了某些私有内容,但是可以通过类的公共方法对其进行更改,那么为什么还要将其声明为私有呢?

来自分类Dev

在不使用元类的情况下将装饰器的所有函数应用于类中

来自分类Dev

如何在 Razor 中应用条件类

来自分类Dev

如何在Haxe中检索模块中所有类的列表?(又名:助手类)

来自分类Dev

如何在Objective c中获取类的所有类方法?

来自分类Dev

如何在Python中获取类的类方法的所有名称

Related 相关文章

  1. 1

    如何将元类应用于我的所有类而无需在类声明中对其进行硬编码

  2. 2

    如何在不进行硬编码的情况下获取C ++中类数组的长度?

  3. 3

    如何在Docker容器上配置环境变量而不在Dockerfile中对其进行硬编码?

  4. 4

    如何在我的元类中获取班级的父类?

  5. 5

    Class.getSimpleName()与在Java中对类名进行硬编码?

  6. 6

    Class.getSimpleName()与在Java中对类名进行硬编码?

  7. 7

    我如何在c ++中稍后转发类的声明并使用其成员函数?

  8. 8

    如何避免每个类中的硬编码WebClient重试时间

  9. 9

    如何在线性分类器中应用类权重进行二元分类?

  10. 10

    如何在我的结构中声明一个类?

  11. 11

    如何访问子类中的变量而不在getter的父类中对其进行初始化

  12. 12

    像在Eclipse中那样进行编码(而非调试)时,如何在Xcode中查看类中所有变量和方法的列表?

  13. 13

    如何在Java Nashorn中声明类?

  14. 14

    如何在类函数中声明const

  15. 15

    如何在继承的类中自动声明类实例变量

  16. 16

    打字稿定义:如何在类中声明类

  17. 17

    如何在不对所有模型进行验证的情况下重用模型中的类

  18. 18

    如何从我的验证器类中消除所有“if”语句

  19. 19

    如何在ruby类中获取所有实例变量?

  20. 20

    如何在Dart中获取类的所有子类?

  21. 21

    如何在Swift中列出所有符合协议的类?

  22. 22

    如何在通用Lisp中获取类的所有实例?

  23. 23

    如何在所有没有JS或JQ中的类的表上添加类?

  24. 24

    (C ++)如果我在类中声明了某些私有内容,但是可以通过类的公共方法对其进行更改,那么为什么还要将其声明为私有呢?

  25. 25

    在不使用元类的情况下将装饰器的所有函数应用于类中

  26. 26

    如何在 Razor 中应用条件类

  27. 27

    如何在Haxe中检索模块中所有类的列表?(又名:助手类)

  28. 28

    如何在Objective c中获取类的所有类方法?

  29. 29

    如何在Python中获取类的类方法的所有名称

热门标签

归档