2024-06-02 07:57:17 发布
网友
parent.py:
parent.py
class A(object): def methodA(self): print("in methodA")
child.py:
child.py
from parent import A class B(A): def methodb(self): print("am in methodb")
在parent.py中是否有调用methodb()的方法?
methodb()
只有当A是抽象基类时,这样做才有意义,这意味着A只是用作其他类的基类,而不是直接实例化。如果是这样的话,您可以在类A上定义methodB,但不让它实现:
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应该来自何处,或者子类需要重写它。
B
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()
您可以在导入后看到这是如何工作的:
>>> 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,即这是不可能的:
foo
a=A() a.foo()
将产生: AttributeError: A instance has no attribute 'testb'
AttributeError: A instance has no attribute 'testb'
因为
>>> dir(A) ['__doc__', '__module__', 'foo'] >>> dir(B) ['__doc__', '__module__', 'foo', 'testb']
我想展示的是,您可以创建子类的实例,它将拥有来自父类和它自己的类的所有方法和参数。
只有当
A
是抽象基类时,这样做才有意义,这意味着A
只是用作其他类的基类,而不是直接实例化。如果是这样的话,您可以在类A上定义methodB
,但不让它实现:这不是绝对必要的。如果您不在
A
中的任何位置声明methodB
,并实例化B
,您仍然可以从methodA
的主体调用methodB
,但这是一种错误的做法;不清楚methodA
应该来自何处,或者子类需要重写它。如果希望更正式,可以使用Python^{} 模块将A声明为抽象基类。
使用它实际上会阻止您在不重写
methodB
的情况下实例化A
或从A
继承的任何类。例如,如果B看起来是这样的:尝试实例化它时会出现错误:
如果尝试实例化
A
,也会发生同样的情况。只要函数附加到一个对象上,就可以在任何地方使用它,该对象似乎来自您的示例。如果您有一个
B
对象,那么您可以从任何地方使用它的methodb()
函数。parent.py:
child.py
您可以在导入后看到这是如何工作的:
当然,您将无法从
parent.py
内部创建新的B
对象,但如果以某种方式将其传递给parent.py
中的函数,则仍然可以使用其方法。你可以这样做:
当然这也会导致:
注意,事实上没有来自父类的调用,只有来自子类实例的函数
foo
的调用,此实例继承了来自父类的foo
,即这是不可能的:将产生:
AttributeError: A instance has no attribute 'testb'
因为
我想展示的是,您可以创建子类的实例,它将拥有来自父类和它自己的类的所有方法和参数。
相关问题 更多 >
编程相关推荐