python 中最接近虚拟通话的事情
Closest thing to a virtual call in python
Python 不提供一些内置的继承机制来调用基方法
派生的 class 中的基虚拟或抽象方法的实现
我想知道 python 中最接近提供以下结构的东西是什么:
class Base(?):
def some_abstract_interface(self, **params):
raise Unimplemented()
def some_base_impl(self):
self.some_abstract_interface(self, a=4, b=3, c=2)
class Derived(Base):
@neat_override_decorator_here?
def some_abstract_interface(self, **params):
print("actual logic here {0}".format(params))
d = Derived()
d.some_base_impl()
>>>output: actual logic here a=4, b=3, c=2
您只需自己拨打电话即可。从语法上讲,这不会比您设置的装饰器更重。
class Derived(Base):
def some_abstract_interface(self, **params):
self.some_base_impl()
print('actual logic her {0}.format(params))
事实上,你甚至不需要将some_base_impl
和some_abstract_interace
分开;一个抽象方法可以有一个实现,但仍然需要覆盖。
from abc import ABC, abstractmethod
class Base(ABC):
@abstractmethod
def some_abstract_interface(self, **params):
pass # Put base implementation here
class Derived(Base):
def some_abstract_interface(self, **params):
super().some_abstract_interface(**params)
print("actual logic here {0}".format(params))
你已经可以在没有任何简洁装饰器的情况下做到这一点:
class Base:
def some_abstract_interface(self):
raise NotImplemented
def some_base_impl(self):
self.some_abstract_interface()
class Derived(Base):
def some_abstract_interface(self):
print('actual logic here')
Derived().some_base_impl()
这输出:
actual logic here
如果你想强制 Base
是一个抽象 class 并且不能用于直接实例化对象,并且 some_abstract_interface
意味着是一个抽象方法并且总是必须被子 class 方法的实现覆盖,您可以使基础 class 继承自 abc
模块的 ABC
class并用 abc.abstractmethod
修饰抽象方法,如下所示:
import abc
class Base(abc.ABC):
@abc.abstractmethod
def some_abstract_interface(self):
raise NotImplemented
def some_base_impl(self):
self.some_abstract_interface()
class Derived(Base):
def some_abstract_interface(self):
print('actual logic here')
Derived().some_base_impl()
Python 不提供一些内置的继承机制来调用基方法
派生的 class 中的基虚拟或抽象方法的实现我想知道 python 中最接近提供以下结构的东西是什么:
class Base(?):
def some_abstract_interface(self, **params):
raise Unimplemented()
def some_base_impl(self):
self.some_abstract_interface(self, a=4, b=3, c=2)
class Derived(Base):
@neat_override_decorator_here?
def some_abstract_interface(self, **params):
print("actual logic here {0}".format(params))
d = Derived()
d.some_base_impl()
>>>output: actual logic here a=4, b=3, c=2
您只需自己拨打电话即可。从语法上讲,这不会比您设置的装饰器更重。
class Derived(Base):
def some_abstract_interface(self, **params):
self.some_base_impl()
print('actual logic her {0}.format(params))
事实上,你甚至不需要将some_base_impl
和some_abstract_interace
分开;一个抽象方法可以有一个实现,但仍然需要覆盖。
from abc import ABC, abstractmethod
class Base(ABC):
@abstractmethod
def some_abstract_interface(self, **params):
pass # Put base implementation here
class Derived(Base):
def some_abstract_interface(self, **params):
super().some_abstract_interface(**params)
print("actual logic here {0}".format(params))
你已经可以在没有任何简洁装饰器的情况下做到这一点:
class Base:
def some_abstract_interface(self):
raise NotImplemented
def some_base_impl(self):
self.some_abstract_interface()
class Derived(Base):
def some_abstract_interface(self):
print('actual logic here')
Derived().some_base_impl()
这输出:
actual logic here
如果你想强制 Base
是一个抽象 class 并且不能用于直接实例化对象,并且 some_abstract_interface
意味着是一个抽象方法并且总是必须被子 class 方法的实现覆盖,您可以使基础 class 继承自 abc
模块的 ABC
class并用 abc.abstractmethod
修饰抽象方法,如下所示:
import abc
class Base(abc.ABC):
@abc.abstractmethod
def some_abstract_interface(self):
raise NotImplemented
def some_base_impl(self):
self.some_abstract_interface()
class Derived(Base):
def some_abstract_interface(self):
print('actual logic here')
Derived().some_base_impl()