在python中从父类文件调用子类方法

2024-06-02 07:57:17 发布

您现在位置:Python中文网/ 问答频道 /正文

parent.py

class A(object):
    def methodA(self):
        print("in methodA")

child.py

from parent import A
class B(A):
    def methodb(self):
        print("am in methodb")

parent.py中是否有调用methodb()的方法?


Tags: 方法infrompyimportselfchildobject
3条回答

只有当A是抽象基类时,这样做才有意义,这意味着A只是用作其他类的基类,而不是直接实例化。如果是这样的话,您可以在类A上定义methodB,但不让它实现:

class A(object):
    def methodA(self):
        print("in methodA")

    def methodB(self):
        raise NotImplementedError("Must override methodB")


from parent import A
class B(A):
    def methodB(self):
        print("am in methodB")

这不是绝对必要的。如果您不在A中的任何位置声明methodB,并实例化B,您仍然可以从methodA的主体调用methodB,但这是一种错误的做法;不清楚methodA应该来自何处,或者子类需要重写它。

如果希望更正式,可以使用Python^{}模块将A声明为抽象基类。

from abc import ABCMeta, abstractmethod

class A(object):
 __metaclass__ = ABCMeta

    def methodA(self):
        print("in methodA")

    @abstractmethod
    def methodB(self):
        raise NotImplementedError("Must override methodB")

使用它实际上会阻止您在不重写methodB的情况下实例化A或从A继承的任何类。例如,如果B看起来是这样的:

class B(A):
   pass

尝试实例化它时会出现错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class B with abstract methods methodB

如果尝试实例化A,也会发生同样的情况。

只要函数附加到一个对象上,就可以在任何地方使用它,该对象似乎来自您的示例。如果您有一个B对象,那么您可以从任何地方使用它的methodb()函数。

parent.py:

class A(object):
    def methoda(self):
        print("in methoda")

def aFoo(obj):
  obj.methodb()

child.py

from parent import A
class B(A):
    def methodb(self):
        print("am in methodb")

您可以在导入后看到这是如何工作的:

>>> from parent import aFoo
>>> from child import B
>>> obj = B()
>>> aFoo(obj)
am in methodb

当然,您将无法从parent.py内部创建新的B对象,但如果以某种方式将其传递给parent.py中的函数,则仍然可以使用其方法。

你可以这样做:

class A():
    def foo(self):
        self.testb()

class B(A):
    def testb(self):
        print('lol, it works')
b = B()
b.foo()

当然这也会导致:

lol, it works

注意,事实上没有来自父类的调用,只有来自子类实例的函数foo的调用,此实例继承了来自父类的foo,即这是不可能的:

a=A()
a.foo()

将产生: AttributeError: A instance has no attribute 'testb'

因为

>>> dir(A)
['__doc__', '__module__', 'foo']
>>> dir(B)
['__doc__', '__module__', 'foo', 'testb']

我想展示的是,您可以创建子类的实例,它将拥有来自父类和它自己的类的所有方法和参数。

相关问题 更多 >