在下面的代码中,我创建了一个基本抽象类Base.我希望所有继承的类都Base提供name属性,所以我创建了这个属性@abstractmethod.
然后我创建了一个Base名为的子类Base_1,它旨在提供一些功能,但仍然是抽象的.没有name属性Base_1,但是python会在没有错误的情况下实现该类的对象.如何创建抽象属性?
from abc import ABCMeta, abstractmethod
class Base(object):
__metaclass__ = ABCMeta
def __init__(self, strDirConfig):
self.strDirConfig = strDirConfig
@abstractmethod
def _doStuff(self, signals):
pass
@property
@abstractmethod
def name(self):
#this property will be supplied by the inheriting classes
#individually
pass
class Base_1(Base):
__metaclass__ = ABCMeta
# this class does not provide the name property, should raise an error
def __init__(self, strDirConfig):
super(Base_1, self).__init__(strDirConfig)
def _doStuff(self, signals): …Run Code Online (Sandbox Code Playgroud) 这是我想要的设置:A应该是一个带有静态和抽象方法f()的抽象基类.B应该从A继承.要求:1.您不应该实例化A 2.您不应该实例化B,除非它实现了静态f()
从这个问题中汲取灵感,我尝试了几种方法.有了这些定义:
class abstractstatic(staticmethod):
__slots__ = ()
def __init__(self, function):
super(abstractstatic, self).__init__(function)
function.__isabstractmethod__ = True
__isabstractmethod__ = True
class A:
__metaclass__ = abc.ABCMeta
@abstractstatic
def f():
pass
class B(A):
def f(self):
print 'f'
class A2:
__metaclass__ = abc.ABCMeta
@staticmethod
@abc.abstractmethod
def f():
pass
class B2(A2):
def f(self):
print 'f'
Run Code Online (Sandbox Code Playgroud)
这里使用通常的Python约定定义A2和B2,并使用本答案中建议的方式定义A和B. 以下是我尝试的一些操作以及不希望的结果.
A/B班:
>>> B().f()
f
#This should have thrown, since B doesn't implement a static f()
Run Code Online (Sandbox Code Playgroud)
A2/B2类:
>>> A2()
<__main__.A2 object at 0x105beea90>
#This should …Run Code Online (Sandbox Code Playgroud)