我有以下类型的超类/子类设置:
class SuperClass(object):
def __init__(self):
self.do_something() # requires the do_something method always be called
def do_something(self):
raise NotImplementedError
class SubClass(SuperClass):
def __init__(self):
super(SuperClass, self).__init__() # this should do_something
def do_something(self):
print "hello"
Run Code Online (Sandbox Code Playgroud)
我希望SuperClass init始终调用一个尚未实现的do_something方法.我正在使用python 2.7.也许ABC可以做到这一点,但它有另一种方式吗?
谢谢.
我一直认为,abc.ABC当不希望实例化该类时,应该继承该实例。但是我刚刚意识到,如果一门课程只有一门课,@abstractmethod那么它也无法实例化它。
还有其他继承的理由ABC吗?
我正在阅读 Luciano Ramalho 写的 Fluent Python 一书,我遇到了以下行:
请注意,内置的具体序列类型实际上并未将所描述的 Sequence 和 MutableSequence 抽象基类 (ABC) 子类化
所以我从 Python 文档中查看了 ABC,但我在理解它们的目的时遇到了问题。
例如,isinstance([], abc.Iterable), 返回True列表,也是如此abc.Sequence,abc.MutableSequence这是有道理的。对于isinstance和issubclass方法,以下内容也是如此。
issubclass(str, abc.MutableSequence) --> False
isinstance((), abc.MutableSequence) --> False
Run Code Online (Sandbox Code Playgroud)
如果我执行以下操作:
class A:
def __iter__(self):
pass
a = A()
isinstance(a, abc.Iterable) # True
issubclass(A, abc.Iterable) # True
Run Code Online (Sandbox Code Playgroud)
但是 Aabc.Iterable在它的类定义中没有子类化(并且,我假设前面提到的其他类也没有,根据这本书)。这些issubclass / isinstance方法和 ABC 接口在这里是如何工作的?这些函数是否只是在类定义中查找 dunder 方法签名并将它们与上述 ABC 类中的 dunder 签名匹配?
除了提供一种验证类是否包含某些特定的 dunder 方法之外,我看不到 ABC 类的任何目的,因此了解更多有关整个过程的目的会很好。
任何形式的帮助将不胜感激。谢谢。
我有一个带有具体方法的 Python ABC(我们称之为A)__init__(),以及一个实现这个 ABC 的类(我们称之为B)。据我了解,我不应该能够实例化 ABC。
问题:类函数super().__init__()内部的调用为什么以及如何工作?我假设创建了父类的一个实例 - 在本例中是 ABC。__init__Bsuper()
from abc import ABC, abstractmethod
from util.fileManager import FileManager
class A(ABC):
def __init__(self):
self.file_manager = FileManager() # Composition object
...
Run Code Online (Sandbox Code Playgroud)
from interfaces.A import A
class B(A):
def __init__(self):
super().__init__()
...
Run Code Online (Sandbox Code Playgroud)
Python 中的“super”有什么作用?- super().__init__() 和显式超类 __init__() 之间的区别
正如你们许多人可能已经看到的那样,这个问题实际上可以归结为super()Python 中的作用。接受我标记的答案,我真的想指出@KarlKnechtel评论中的链接,因为它帮助我进一步了解情况。
我编写了一个模拟abc模块和模块使用的代码properties.但是,似乎我无法访问width和height变量.代码如下:
from abc import ABCMeta, abstractmethod
class Polygon:
__metaclass__ = ABCMeta
@abstractmethod
def compute_area(self): pass
def __init__(self):
self.width = None
self.height = None
@property
def width_prop(self):
return self.width
@property
def height_prop(self):
return self.height
@width_setter.setter
def width_setter(self, width):
self.width = width
@height_setter.setter
def height_setter(self, height):
self.height = height
class Triangle(Polygon):
def compute_area(self):
return 0.5 * width * height
if __name__ == "__main__":
tri = Triangle()
tri.height_setter(20)
tri.width_setter(30)
print "Area of the triangle = …Run Code Online (Sandbox Code Playgroud)