标签: abc

Python 中具有特定参数的抽象方法

我用 abc 包实现了抽象类。下面的程序显示没有问题。

有没有办法让它失败,因为抽象MyMethod确实有一个参数,a但类中的“MyMethod”的实现Derivative没有?所以我不仅要指定接口类中的方法,还要指定Base这些方法的参数。

import abc

#Abstract class
class Base(object):
    __metaclass__  = abc.ABCMeta

    @abc.abstractmethod
    def MyMethod(self, a):
        'MyMethod prints a'


class Derivative(Base)

    def MyMethod(self):
        print 'MyMethod'
Run Code Online (Sandbox Code Playgroud)

python oop class abc abstract

6
推荐指数
1
解决办法
4810
查看次数

是否有一种python方式将“对象和列表”之类的“序列”对象与“字节和str”之类的“序列”对象区分开来

我有这样的功能

def print_stuff(items):
    if isinstance(items, (str, bytes)):
        items = (items,)
    for item in items:
        print (item)
Run Code Online (Sandbox Code Playgroud)

可以这样称呼:

In [37]: print_stuff(('a', 'b'))
a
b

In [38]: print_stuff('a')
a
Run Code Online (Sandbox Code Playgroud)

我不喜欢做,isinstance (items, (str, bytes))我更愿意做isinstance(item, (collections.abc.MAGIC))

其中MAGIC是所有序列对象的ABC,可以包含其他序列对象,例如

  • 元组
  • 清单
  • numpy.array
  • 一些用户定义的矢量类,等等

但不是:

  • 力量
  • 个字节
  • 一些用户定义的UTF-16的str类,等等

恐怕这是不可能的,tuple并且str具有相同的7个ABC :(

In [49]: [v for k, v in vars(collections.abc).items()
    ...:                                   if inspect.isclass(v) and issubclass(tuple, v) ]
Out[49]:
[collections.abc.Hashable,
 collections.abc.Iterable,
 collections.abc.Reversible,
 collections.abc.Sized,
 collections.abc.Container,
 collections.abc.Collection,
 collections.abc.Sequence]

In [50]: [v for k, v in …
Run Code Online (Sandbox Code Playgroud)

abc python-3.x

6
推荐指数
1
解决办法
548
查看次数

使用带有`abc`库的抽象类时获取python类名

我想在使用带有abc库的抽象类时提取 python 类名。不幸的是,我收到了 class name ABCMeta


import abc

class A(abc.ABC)
    pass

class B(A)
    pass

print(A.__class__.__name__)  # output: 'ABCMeta'
print(B.__class__.__name__)  # output: 'ABCMeta'
print(str(A))  # output: "<class '__main__.A'>"
print(str(B))  # output: "<class '__main__.B'>"

Run Code Online (Sandbox Code Playgroud)

我希望我应该收到如下输出

print(A.__class__.__name__)  # output: 'A'
print(B.__class__.__name__)  # output: 'B'
Run Code Online (Sandbox Code Playgroud)

str(A)str(B)似乎让我假设类的名字可以从什么地方提取打印的类名。但尽管如此,我对str用来解析和获取类名不感兴趣。

python abc

6
推荐指数
1
解决办法
1031
查看次数

Python中的抽象方法继承

假设我们有一个 Python 类,它使用abc模块来定义一个抽象属性:

import abc

class A(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractproperty
    def test_attribute(self):
        raise NotImplementedError
Run Code Online (Sandbox Code Playgroud)

现在让我们考虑通过添加新方法 ( )B来定义子类,并通过实现最初在 中声明的抽象方法来定义子类:Atest_method()CBA

class B(A):

    def test_method(self):
        pass

class C(B):

    def test_attribute(self):
        # Implement abstract attribute
        pass
Run Code Online (Sandbox Code Playgroud)

假设我想保持B抽象(不可实例化),我是否应该test_attribute在 中重新定义抽象属性 ( ) 和元类赋值B?或者继承它们就足够了A(如上面的代码)?

我知道Python允许我不重新定义抽象方法,从而从父类继承它们。从理论软件工程的角度来看,这是正确的吗?

我这么问是因为如果我没记错的话,其他语言(例如Java)不允许继承抽象方法而不将它们重新实现为抽象......

python inheritance abc abstract

5
推荐指数
1
解决办法
4984
查看次数

是否有可能成为内置类型的虚拟子类?

是否可以使用户定义的类型成为Python中内置类型的虚拟子类?我希望我的类被视为 的子类int,但是我想像这样直接继承:

class MyInt(int):
    '''Do some stuff kind of like an int, but not exactly'''
    pass
Run Code Online (Sandbox Code Playgroud)

从那时起,我的类实际上变得不可变,无论我是否愿意。例如,不可能使用像__iadd__和 这样的方法__isub__,因为int无法修改自身。我可以继承numbers.Integral,但是当有人打电话时isinstance(myIntObj, int)或者issubclass(MyInt, int)会得到答复False。据我所知,具有 ABCMeta 元类的类可以使用该方法register将类注册为不真正从它们继承的虚拟基类。有没有办法用内置类型来做到这一点?就像是:

registerAsParent(int, MyInt)
Run Code Online (Sandbox Code Playgroud)

我环顾四周(无论是在 python 文档中还是在网上),但还没有找到任何接近我正在寻找的东西。我所要求的完全不可能吗?

python inheritance subclass abc

5
推荐指数
1
解决办法
565
查看次数

记录抽象基类的属性?

我有一个抽象基类,并且每个后代都应该具有某些属性(类型为 str、int 等),因此在基类中记录这些属性是有意义的。在 Python 3.6+ 中记录这些属性的推荐格式是什么?

python oop abc python-3.x

5
推荐指数
1
解决办法
76
查看次数

Python 抽象 setter 和 getter

我想编写抽象类,强制继承类在我的抽象类中实现所有方法和属性。

另外,我想对我的抽象属性使用 setter 和 getter,以使我的代码整洁并看起来很好

但是,当前的实现:

import abc


class Component(metaclass=abc.ABCMeta):

    @property
    @abc.abstractmethod
    def status(self):
        pass

    @property
    @status.setter
    @abc.abstractmethod
    def status(self, value):
        pass
Run Code Online (Sandbox Code Playgroud)

确实强制继承类为我的抽象属性 getter 实现 getter,但不强制创建属性设置器(这正是我想要的)

我怎样才能在不失去应用进一步提到的方法的所有好处的情况下实现这种行为(也就是编写新方法并在我的抽象类 setter 中执行它们)?

python properties abc getter-setter

5
推荐指数
1
解决办法
620
查看次数

PyCharm 在有意抽象的子类上“必须实现所有抽象方法”

我有一个抽象基类,Animal

class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def move(self):
        raise NotImplementedError()

    @abc.abstractmethod
    def eat(self):
        raise NotImplementedError()
Run Code Online (Sandbox Code Playgroud)

现在我有另一个 abc 只实现了这些方法之一:

class Bird(Animal):
    def move(self):
        print("fly")
Run Code Online (Sandbox Code Playgroud)

另一个实现缺失方法的类:

class Eagle(Bird):
    def eat(self):
        print("eagle eats")
Run Code Online (Sandbox Code Playgroud)

但是 PyCharm 抱怨Bird它“必须实现所有抽象方法”,而我故意希望它保持抽象。

我错过了什么,还是这是一个错误?如果这只是一个错误,我可以以某种方式忽略警告#noqa吗(类似于)?

abstract-class abc pycharm python-3.x

5
推荐指数
1
解决办法
4616
查看次数

Python中没有抽象方法的抽象数据类:禁止实例化

即使一个类是从 继承的ABC,看起来它仍然可以被实例化,除非它包含抽象方法。

有了下面的代码,防止Identifier创建对象的最佳方法是什么:Identifier(['get', 'Name'])

from abc import ABC
from typing import List
from dataclasses import dataclass

@dataclass
class Identifier(ABC):
    sub_tokens: List[str]

    @staticmethod
    def from_sub_tokens(sub_tokens):
        return SimpleIdentifier(sub_tokens) if len(sub_tokens) == 1 else CompoundIdentifier(sub_tokens)


@dataclass
class SimpleIdentifier(Identifier):
    pass


@dataclass
class CompoundIdentifier(Identifier):
    pass
Run Code Online (Sandbox Code Playgroud)

如果这个问题已经得到回答,我提前道歉。这看起来很基本,但是,由于某种原因我找不到答案。

干杯,赫利卜。

python oop abc python-3.x python-dataclasses

5
推荐指数
2
解决办法
2721
查看次数

抽象类(元类=ABCMeta)和抽象类(ABC)之间的区别

我见过两种在python. 有什么区别,分别有哪些使用场景?

from abc import ABCMeta, abstractmethod
class AbstactClass(metaclass = ABCMeta):
Run Code Online (Sandbox Code Playgroud)

from abc import ABC, abstractmethod
class AbstractClass2(ABC):
Run Code Online (Sandbox Code Playgroud)

python abstract-class abc python-3.x

5
推荐指数
1
解决办法
34
查看次数