如何在抽象类中调用非抽象方法?

2024-04-19 08:51:36 发布

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

我在python中有一个抽象类,希望在其中调用非抽象方法。有可能吗?你知道吗

from abc import ABC, abstractmethod
class MyAbstract(ABC):

# Can I call method get_state() from get_current() ?
def get_state():
   get_current()  # gives me error?

def get_current():

@abstractmethod
def get_time():

我有另一个python文件,温度py实现这个接口。 在温度py,我使用MyAbstract.get_state()调用get_state,得到的错误是get_current()未定义。你知道吗

不知道为什么。你知道吗

感谢您的帮助。你知道吗


Tags: 方法frompyimportgetdef抽象类current
1条回答
网友
1楼 · 发布于 2024-04-19 08:51:36

通常,所有方法都有一个名称空间,即它们所附加到的类或对象。如果您有一个类的实例四处浮动(例如self,大多数情况下),您可以在该实例上调用方法,自动将实例本身作为第一个参数传递-该实例充当实例方法的命名空间。你知道吗

如果您使用的是类方法或静态方法,那么名称空间几乎总是它们所附加到的类。如果您没有指定名称空间,那么python假设您试图调用的任何函数都在全局名称空间中,如果不是,那么您将得到一个NameError。你知道吗

在这种情况下,以下各项对您适用:

class MyAbstract(ABC):
    def get_current():
        print("current")

    def get_state():
        MyAbstract.get_current()

    @abstractmethod
    def get_time():
        pass

你可以想象,你有一个不可见的@staticmethod装饰挂在get_current()上面,这样标记它。问题是现在你不能改变子类中get_current()的行为来影响get_state()的变化。解决方法是使get_state()成为类方法:

    @classmethod
    def get_state(cls):
        cls.get_current()

调用静态方法使用与调用类方法相同的语法(在这两种情况下,您都会执行MyAbstract.get_state(),但后者将调用它的类作为第一个参数传递。然后,您可以使用这个类作为名称空间来为最近定义它的任何子类找到方法get_current(),这就是您如何用方法实现多态性,否则这个方法是静态的。你知道吗

相关问题 更多 >