Python入门:实现虚拟方法
问题描述:
第一天学习Python的,请原谅的基本问题。Python入门:实现虚拟方法
假设我一直在考虑一个对象,它包含了我需要实现一个未实现的方法,e.g:
class myclass():
def __init__(self)
self.unimplementedmethod = False
什么是实例化对象来实现这一正确的方法是什么?我不想以任何方式改变基类。 我已经试验过,发现下面的代码似乎可行,但它是正确的还是很好的风格?
def methodimplementation():
print("method called")
myobject = myclass()
myobject.unimplementedmethod=methodimplementation
这是正确的道路吗?或者我应该做一些不同的事情,比如先创建一个派生类,然后实现其中的方法,然后基于派生类实例化一个对象?什么是最佳做法?
答
您需要子类的基类:
class myclass():
def some_method():
raise NotImplementedError
class my_subclass(myclass):
def some_method():
print("method called")
答
你想创建一个abstract base class。为此,您需要在您的基类中继承abc.ABCMeta
。然后将该方法定义为抽象,您需要用@abstractmethod
对其进行修饰。例如:
class MyChildClass(BaseClass):
def my_method():
print 'my method'
答
好点的方法是使用的子类,但是如果你不能做到这一点,这里是进入self
道:
from abc import ABCMeta, abstractmethod
class BaseClass(ABCMeta):
@abstractmethod
def my_method():
pass
然后,你可以创建子类从在一个类中没有定义的简单函数:
class Bar:
def __init__(self):
pass
def foo(self):
try:
self._foo(self)
except AttributeError:
raise NotImplementedError
def set_foo(self, function):
setattr(self, '_foo', function)
def another_method(self):
print "Another method from {}".format(self)
def foo(self):
self.another_method()
bar = Bar()
bar.set_foo(foo)
bar.foo()
所以,def foo(self)
定义一个函数与一个参数self
,等的方法。这个函数调用实例方法another_method
。
Bar.set_foo
在Bar
的实例中创建一个新属性_foo
。
最后,Bar.foo
试图以self
作为参数访问self._foo
。如果_foo
是不存在的,Bar.foo
将引发一个NotImplementedError预期。
喜欢它,你可以从foo
访问self
无子类。
你应该继承的类,是的。和未实现的方法不应该有值'FALSE',而是(如果有的话)应该返回单'NotImplemented'实际的方法。 – L3viathan
Thankyou。这是来自开源项目“Printrun”。 P.S该死的快! –
我知道这是不是一个代码审查,但你并不需要'()''中MyClass的类():'(但是,你应该永远继承'object'如果你正在写的Python 2)。 – Tobias