Tag: 元类

调用元类时出错:函数()参数1必须是代码,而不是str

今天早些时候我尝试了一下线程化的条件,但是没有成功。 当我尝试对threading.Condition进行子类化时,下面是Python解释器的输出: >>> import threading >>> class ThisWontWork(threading.Condition): … pass … Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: Error when calling the metaclass bases function() argument 1 must be code, not str 有人可以解释这个错误? 谢谢!

三重inheritance导致元类冲突…有时

看起来我偶然发现了一个元类的地狱,即使我不想和它有任何关系。 我正在使用PySide在Qt4中编写一个应用程序。 我想将事件驱动的部分从Qt Designer文件生成的UI定义中分离出来。 因此,我创build了一个“控制器”类,但为了缓解我的生活,我多次inheritance它们。 一个例子: class BaseController(QObject): def setupEvents(self, parent): self.window = parent class MainController(BaseController): pass class MainWindow(QMainWindow, Ui_MainWindow, MainController): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.setupUi(self) self.setupEvents(self) 这按预期工作。 它也有从( QDialog , Ui_Dialog , BaseController )inheritance。 但是,当我的子类BaseController并尝试从所述的子类(代替BaseController )inheritance,我收到一个错误: TypeError:调用元类时出错基类元类冲突:派生类的元类必须是其所有元的元类的(非严格)子类 说明: QMainWindow和QDialog都从QObjectinheritance。 由于Qt事件系统的特性, BaseController也必须inheritance它。 Ui_类只能从简单的Python对象类inheritance。 我寻找解决scheme,但都涉及故意使用元类的情况。 所以我一定在做一些非常错误的事情。 编辑:我的描述可能会更清楚通过添加graphics。 工作示例: QObject | \___________________ | object | QMainWindow […]

元类多inheritance不一致

为什么是这样: class MyType(type): def __init__(cls, name, bases, attrs): print 'created', cls class MyMixin: __metaclass__ = MyType class MyList(list, MyMixin): pass 好吧,并按预期工作: created <class '__main__.MyMixin'> created <class '__main__.MyList'> 但是这个: class MyType(type): def __init__(cls, name, bases, attrs): print 'created', cls class MyMixin: __metaclass__ = MyType class MyObject(object, MyMixin): pass 不好吗,这样炸了吗? created <class '__main__.MyMixin'> Traceback (most recent call […]

Python中的元类是什么(具体的)用例?

我有一个喜欢使用元类的朋友,经常提供他们作为解决scheme。 我想到你几乎不需要使用元类。 为什么? 因为我认为如果你正在做类似的事情,你可能应该做一个对象。 而一个小的重新devise/重构是为了。 能够使用元类使很多地方的人把类作为某种二级对象,这对我来说似乎是灾难性的。 编程是否被元编程取代? 不幸的是,类装饰器的添加使得它更加可以接受。 所以,请绝望的去了解Python中元类的有效(具体)用例。 或者开悟一下为什么变异类比变异对象更好,有时候。 我将开始: 有时在使用第三方库时,能够以某种方式改变这个类是很有用的。 (这是我能想到的唯一的情况,而不是具体的)

Django的Meta类如何工作?

我正在使用Django,它允许人们通过使用class Meta添加额外的参数。 class FooModel(models.Model): … class Meta: … 我在Python文档中唯一发现的是: class FooMetaClass(type): … class FooClass: __metaclass__ = FooMetaClass 但是,我不认为这是一回事。

如何读取与声明相同的顺序的类属性?

我正在写一个读取类属性并将它们存储在列表中的元类,但是我希望列表(cls.columns)遵守声明顺序(即: mycol2 , mycol3 , zut , cool , menfin ,在我的示例中) : import inspect import pprint class Column(object): pass class ListingMeta(type): def __new__(meta, classname, bases, classDict): cls = type.__new__(meta, classname, bases, classDict) cls.columns = inspect.getmembers(cls, lambda o: isinstance(o, Column)) cls.nb_columns = len(cls.columns) return cls class Listing(object): __metaclass__ = ListingMeta mycol2 = Column() mycol3 = Column() […]

在Python中创build一个单例

这个问题不是讨论单例devise模式是否合意,是反模式还是任何宗教战争,而是讨论如何在python中最好的实现这种模式。 在这种情况下,我把“最pythonic”定义为遵循“最不惊讶的原则” 。 我有多个类将成为单身(我的用例是一个logging器,但这不是重要的)。 当我可以简单地inheritance或装饰时,我不希望杂乱地加上几个类似的东西。 最好的方法: 方法1:一个装饰器 def singleton(class_): instances = {} def getinstance(*args, **kwargs): if class_ not in instances: instances[class_] = class_(*args, **kwargs) return instances[class_] return getinstance @singleton class MyClass(BaseClass): pass 优点 装饰器是以一种比多重inheritance更直观的方式添加的。 缺点 虽然使用MyClass()创build的对象将是真正的单例对象,MyClass本身是一个函数,而不是一个类,所以你不能从它调用类的方法。 另外对于m = MyClass(); n = MyClass(); o = type(n)(); m = MyClass(); n = MyClass(); o = type(n)(); 那么m […]