如何在Python中创建一个行为类似Django抽象基类的类?

2024-10-05 13:22:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用一个现有的Django库,我正在创建一个我想要抽象的类。在

假设有问题的类是BaseFoo。在

目前,这个实现有一个基类BaseFoo。在

每次创建扩展BaseFoo的类时,元类都会将其添加到类列表中。它不会通过对类名进行硬编码测试来显式地添加BaseFoo

    if name not in ('BaseFoo',):
        class_list.append(new_cls)

我希望能写一些东西,比如:

^{pr2}$

并让元类跳过所有抽象的BaseFoo对象。所以我想知道Django是如何对模特做同样的事情的,以及是否有一种简单、优雅的方式来实现这一点。在

我已经看过Django用来定义模型的一些代码,但是我可以使用一些指针。另外,如果有一种更简单的方法来做到这一点而不必使用class Meta,我也很乐意接受。在

请注意,我对这个解决方案并不感到特别兴奋:

class MyBaseFoo(BaseFoo):
    abstract = True

class ActualFoo1(MyBaseFoo):
    abstract = False

class ActualFoo2(MyBaseFoo):
    abstract = False

Tags: djangonameinabstractfalse编码列表if
1条回答
网友
1楼 · 发布于 2024-10-05 13:22:39

在具体类中不需要将abstract设置为False—只在抽象类中设置此设置就足够了:

class_list = []
class CollectSubclasses(type):
    def __new__(cls, name, bases, attrs):
        abstract = False
        if attrs.get('abstract', False):
            abstract = True
            del attrs['abstract']
        res = super(CollectSubclasses, cls).__new__(cls, name, bases, attrs)
        if not abstract:
            class_list.append(res)
        return res

class BaseFoo(object):
    __metaclass__ = CollectSubclasses
    abstract = True

class Concrete1(BaseFoo):
    pass

class Abstract(BaseFoo):
    abstract = True

class Concrete2(Abstract):
    pass

print class_list

但是,可能已经在类中调用了@decorators,或者已经在类中调用了@decorators,或者已经在类中调用了@decorators。在

相关问题 更多 >

    热门问题