Python入门:实现虚拟方法

问题描述:

第一天学习Python的,请原谅的基本问题。Python入门:实现虚拟方法

假设我一直在考虑一个对象,它包含了我需要实现一个未实现的方法,e.g:

class myclass(): 
    def __init__(self) 
    self.unimplementedmethod = False 

什么是实例化对象来实现这一正确的方法是什么?我不想以任何方式改变基类。 我已经试验过,发现下面的代码似乎可行,但它是正确的还是很好的风格?

def methodimplementation(): 
    print("method called") 

myobject = myclass() 
myobject.unimplementedmethod=methodimplementation 

这是正确的道路吗?或者我应该做一些不同的事情,比如先创建一个派生类,然后实现其中的方法,然后基于派生类实例化一个对象?什么是最佳做法?

+1

你应该继承的类,是的。和未实现的方法不应该有值'FALSE',而是(如果有的话)应该返回单'NotImplemented'实际的方法。 – L3viathan

+0

Thankyou。这是来自开源项目“Printrun”。 P.S该死的快! –

+1

我知道这是不是一个代码审查,但你并不需要'()''中MyClass的类():'(但是,你应该永远继承'object'如果你正在写的Python 2)。 – Tobias

您需要子类的基类:

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_fooBar的实例中创建一个新属性_foo

最后,Bar.foo试图以self作为参数访问self._foo。如果_foo是不存在的,Bar.foo将引发一个NotImplementedError预期。

喜欢它,你可以从foo访问self无子类。