学习Python:实现虚拟方法

时间:2016-12-02 16:00:39

标签: python

第一天学习Python,请原谅基本问题。

假设我已经获得了一个包含我需要实现的未实现方法的对象,例如:

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

在实例化对象中实现它的正确方法是什么?我不想以任何方式改变基类。 我已经进行了实验,发现下面的代码似乎有效,但它是正确/好的风格吗?

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

myobject = myclass()
myobject.unimplementedmethod=methodimplementation

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

3 个答案:

答案 0 :(得分:2)

您需要对基类进行子类化:

class myclass():
    def some_method():
        raise NotImplementedError

class my_subclass(myclass):
    def some_method():
        print("method called")

答案 1 :(得分:0)

您想要创建abstract base class。为此,您需要在基类中继承abc.ABCMeta。然后将方法定义为抽象,您需要使用@abstractmethod来装饰它。例如:

from abc import ABCMeta, abstractmethod

class BaseClass(ABCMeta):
    @abstractmethod
    def my_method():
        pass

然后您可以将子类创建为:

class MyChildClass(BaseClass):
    def my_method():
        print 'my method'

答案 2 :(得分:0)

好方法是使用子类,但是如果你不能这样做,这里有一种从类未定义的简单函数访问self的方法:

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

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

就像它一样,您可以从self访问foo而无需子类。