标签: abc

如何使抽象类继承自 Python 中的另一个抽象类?

是否可以从 Python 中的另一个抽象类继承一个抽象类?

如果是这样,我该怎么做?

python oop class abc abstract

17
推荐指数
2
解决办法
7349
查看次数

将abc子类化的django模型会产生元类冲突

我有一个以下模型和抽象基类

import abc
from django.db import models


class AbstractBase():
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def my_method(self):
        return


class MyModel(models.Model, AbstractBase):
    @abc.abstractmethod
    def my_method(self):
        return 1
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误.

元类冲突:派生类的元类必须是其所有基类的元类的(非严格)子类

我认为这里的问题是(正如这里描述的那样http://code.activestate.com/recipes/204197-solving-the-metaclass-conflict/)两个基类有两个不同的元类,所以python无法决定哪个元类到用于子对象.

为了解决这个问题,我删除了多个继承并使用以下寄存器方法来注册子类

abc.register(Child)
Run Code Online (Sandbox Code Playgroud)

但我真的不喜欢这种方法,因为它看起来像猴子修补.

有没有其他方法可以解决这个问题?

我尝试明确地将模型元类分配给Child,但它不起作用.我不是在寻找通过编写代码来解决它的方法.我认为这必须通过改变我的类结构来解决.

python django conflict metaclass abc

13
推荐指数
1
解决办法
2201
查看次数

为什么bytearray不是Python 2中的Sequence?

我看到Python 2和3之间的行为有一种奇怪的差异.

在Python 3中,似乎工作正常:

Python 3.5.0rc2 (v3.5.0rc2:cc15d736d860, Aug 25 2015, 04:45:41) [MSC v.1900 32 b
it (Intel)] on win32
>>> from collections import Sequence
>>> isinstance(bytearray(b"56"), Sequence)
True
Run Code Online (Sandbox Code Playgroud)

但不是在Python 2中:

Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on wi
n32
>>> from collections import Sequence
>>> isinstance(bytearray("56"), Sequence)
False
Run Code Online (Sandbox Code Playgroud)

在Python 2.x和3.x的次要版本中,结果似乎是一致的.这是一个已知的错误?它是一个bug吗?这种差异背后有什么逻辑吗?

我实际上更担心C API函数PySequence_Check正确识别类型的对象,PyByteArray_Type因为它暴露了序列协议,通过查看它看起来应该的源代码,但是对这整个事物的任何洞察都是非常受欢迎的.

python bytearray abc python-internals

12
推荐指数
1
解决办法
264
查看次数

python抽象基类可以从C扩展继承吗?

好像当我有一个继承自gevent.Greenlet的抽象基类(它继承自C扩展模块greenlet:https://github.com/python-greenlet/greenlet)时,实现它的类不会引发任何关于未实现方法的abc错误.

class ActorBase(gevent.Greenlet):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def foo(self):
        print "foo"

class ActorBaseTest(ActorBase):
    def bar(self):
        print "bar"

abt = ActorBaseTest()  # no errors!
Run Code Online (Sandbox Code Playgroud)

如果我从object它继承失败按预期方式:

class ActorBase(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def foo(self):
        print "foo"

class ActorBaseTest(ActorBase):
    def bar(self):
        print "bar"

>>> abt = ActorBaseTest()
Traceback (most recent call last):
  File "/home/dw/.virtualenvs/prj/local/lib/python2.7/site-packages/IPython/core/interactiveshell.py", line 2827, in run_code
exec code_obj in self.user_global_ns, self.user_ns
  File "<ipython-input-6-d67a142e7297>", line 1, in <module>
    abt = ActorBaseTest()
TypeError: Can't instantiate abstract class …
Run Code Online (Sandbox Code Playgroud)

python inheritance abc gevent greenlets

11
推荐指数
1
解决办法
801
查看次数

区分具有相同字段的 Pydantic 模型

我使用 Pydantic 定义分层数据,其中存在具有相同属性的模型。

但是,当我保存和加载这些模型时,Pydantic 无法再区分使用了哪个模型,并选择字段类型注释中的第一个模型。

我知道这是基于文档的预期行为。但是,类类型信息对我的应用程序很重要。

在 Pydantic 中区分不同类的推荐方法是什么?一种技巧是简单地向其中一个模型添加一个无关的字段,但我想找到一种更优雅的解决方案。

请参阅下面的简化示例:container使用 类型的数据进行初始化DataB,但在导出和加载之后,newcontainer具有类型的数据DataA,因为它是 类型声明中的第一个元素container.data

感谢您的帮助!

from abc import ABC
from pydantic import BaseModel #pydantic 1.8.2
from typing import Union

class Data(BaseModel, ABC):
    """ base class for a Member """
    number: float

class DataA(Data):
    """ A type of Data"""
    pass

class DataB(Data):
    """ Another type of Data """
    pass

class Container(BaseModel):
    """ container holds a subclass of Data """
    data: Union[DataA, …
Run Code Online (Sandbox Code Playgroud)

python abc pydantic

11
推荐指数
1
解决办法
1万
查看次数

Python继承,元类和type()函数

我无法理解为什么以下代码表现出特定的方式,如下所述:

from abc import ABCMeta   

class PackageClass(object):
    __metaclass__ = ABCMeta        

class MyClass1(PackageClass):
    pass

MyClass2 = type('MyClass2', (PackageClass, ), {})

print MyClass1
print MyClass2

>>> <class '__main__.MyClass1'> 
>>> <class 'abc.MyClass2'>
Run Code Online (Sandbox Code Playgroud)

为什么repr(MyClass2)abc.MyClass2(这是不正确的)?谢谢!

python class abc python-import

10
推荐指数
1
解决办法
478
查看次数

具有指定元类的 Python abc 继承

如果类指定了元类,从 ABC 继承的正确方法是什么?

直接的尝试

class KindMeta(type):
    ...

class Kind(ABC, metaclass=KindMeta):
    ...
Run Code Online (Sandbox Code Playgroud)

导致TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

在 KindMeta 中继承 ABCMeta 似乎有点错误,因为这mcs也用于创建非抽象类。

创建从 KindMeta 继承的自定义 ABC 听起来也不错。

有没有更好的处理方法?或者哪个解决方案更Pythonic并且应该是首选?

metaclass abc python-3.x

10
推荐指数
1
解决办法
3229
查看次数

类型提示子类返回自我

有没有办法输入抽象父类方法,以便知道子类方法返回自身,而不是抽象父类。

class Parent(ABC):
    @abstractmethod
    def method(self) -> [what to hint here]:
        pass

class Child1(Parent)
    def method(self):
        pass

    def other_method(self):
        pass

class GrandChild1(Child1)
    def other_method_2(self):
        pass
Run Code Online (Sandbox Code Playgroud)

这更多是为了改进 PyCharm 或 VScode 的 python 插件等 IDE 的自动完成功能。

python abstract-class abc type-hinting

10
推荐指数
1
解决办法
1212
查看次数

具有不同参数量的抽象类

我想知道在使用抽象方法创建抽象类时是否可能,如果它可以允许派生类中的那些方法的实现为每个函数提供不同数量的参数.

我目前有抽象课

from abc import ABCMeta, abstractmethod

class View(metaclass=ABCMeta):
    @abstractmethod
    def set(self):
        pass

    @abstractmethod
    def get(self):
        pass
Run Code Online (Sandbox Code Playgroud)

但是我希望能够在一个类中实现它,set有1个参数并且得到2(set(param1)get(param1, param2)),然后在另一个类中也继承它但是有0个参数set,2个用于get (set()get(param1, param2)).

这是可能的,如果是这样,我将如何去做

python abc python-3.x

9
推荐指数
2
解决办法
5134
查看次数

python ABC &amp; 多重继承

我想知道是否可以在 python 中使用带有抽象基类的多重继承。似乎应该是可能的,但无法以一种或另一种方式找到声明。

基本的 ABC 示例:


from abc import ABC, abstractmethod


class BaseABC(ABC):

    @abstractmethod
    def hello(self):
        pass


class Child(BaseABC):
    pass


child = Child()

Run Code Online (Sandbox Code Playgroud)

由于“hello”未在“Child”中实现,这将失败。

我想知道如何将 ABC 与多重继承结合起来。我想让“BaseABC”或“Child”也从其他一些单独的类继承。明确:


from abc import ABC, abstractmethod


class BaseABC(ABC, dict):

    @abstractmethod
    def hello(self):
        pass


class Child(BaseABC):
    pass


child = Child()

Run Code Online (Sandbox Code Playgroud)

这不会像第一种情况那样以预期的方式失败。还:


from abc import ABC, abstractmethod


class BaseABC(ABC):

    @abstractmethod
    def hello(self):
        pass


class Child(BaseABC, dict):
    pass


child = Child()

Run Code Online (Sandbox Code Playgroud)

这也不会失败。我怎样才能要求“孩子”来实现“你好”?

python multiple-inheritance abc

9
推荐指数
1
解决办法
285
查看次数