第一天学习Python,请原谅基本问题。
假设我已经获得了一个包含我需要实现的未实现方法的对象,例如:
class myclass():
def __init__(self)
self.unimplementedmethod = False
在实例化对象中实现它的正确方法是什么?我不想以任何方式改变基类。 我已经进行了实验,发现下面的代码似乎有效,但它是正确/好的风格吗?
def methodimplementation():
print("method called")
myobject = myclass()
myobject.unimplementedmethod=methodimplementation
这是正确的道路吗?或者我应该做一些不同的事情,比如首先创建一个派生类,实现其中的方法,然后基于派生类实例化一个对象?什么是最佳做法?
答案 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
而无需子类。