在python中,当在派生类中调用某个方法时,如何调用基类函数?

在python中,当在派生类中调用某个方法时,如何调用基类函数?,python,inheritance,Python,Inheritance,我正在用类似python的语言定义一个基类 class Base(object): def __init__(self): self._changed = False 以及一些派生类: class Car(Base): def set_type(self, type_): # do something def set_mileage(self, mileage): # do something class Flowe

我正在用类似python的语言定义一个基类

class Base(object): 
    def __init__(self):
        self._changed = False
以及一些派生类:

class Car(Base):
    def set_type(self, type_):
        # do something

    def set_mileage(self, mileage):
        # do something

class Flower(base):
    def set_name(self, name):
        # do something
在本例中,我现在希望在调用某个派生类的
set
方法时,将属性“\u changed”设置为
True
。我可以简单地添加一行

self._changed = True
对于每个
set
方法,或者使用decorator,但我正在寻找一种更方便、更自动的方法,每当调用一个名称以“set\”开头的方法时都可以这样做。我正在考虑使用
\uuuu getattribute\uuuu
类似于以下未尝试(且不起作用)的示例:

def __getattribute__(self, name):
    if name.startswith('set_'):
        self._changed = True
    return self.__getattribute__(name)

那么如何以正确的方式实现它呢?

我会为此使用一个装饰器。类似这样的东西(未经测试):

然后在任何get方法中,您只需执行此操作即可

@isGet
def set_mileage(self, mileage):
    # dosomething

更新:这是一个完全有效的示例,它使用了一个元类和一个描述符以及setter和getter:

class Field(object):

    def __get__(self, ins, type):
        return getattr(ins, self.field_name, None)

    def __set__(self, ins, val):
        setattr(ins, self.field_name, val)
        ins._changed = True

class Meta(type):
    def __new__(cls, clsname, bases, dct):
        for k, v in dct.items():
            if isinstance(v, Field):
                v.field_name = '_' + k
        return type.__new__(cls, clsname, bases, dct)

class Base(object):
    __metaclass__ = Meta
    def __init__(self):
        self._changed = False

class Car(Base):

    type = Field()
    mileage = Field()

class Flower(Base):

    name = Field()
演示:

>>> c = Car()
>>> c._changed
False
>>> c.type = "4X4"
>>> c._changed
True
>>> c1 = Car()
>>> c1._changed
False
>>> c1.mileage = 100
>>> c1._changed
True
>>> c.type
'4X4'
>>> c1.mileage
100
>>> f = Flower()
>>> f._changed
False
>>> f.name = "Rose"
>>> f._changed
True
>>> f.name
'Rose'

元类可以在这里工作:

from types import FunctionType
from functools import wraps

class Setter(type):
    def __new__(cls, clsname, bases, dct):
        for item in dct:
            if item.startswith("set_") and isinstance(dct[item], FunctionType):
                dct[item] = cls.changer(dct[item])
        return super(Setter, cls).__new__(cls, clsname, bases, dct)

    @staticmethod
    def changer(func):
        @wraps(func)
        def wrapper(self, *args, **kwargs):
            self._changed = True
            return func(self, *args, **kwargs)
        return wrapper


class Base(object): 
    __metaclass__ = Setter
    def __init__(self):
        self._changed = False
然后像平常一样从Base继承

示例用法:

>>> from meta import Car
>>> c = Car()
>>> c._changed
False
>>> c.set_type("blah")
ok
>>> c._changed
True

元类只是自动修饰类“
\uuu dict\uuu
中以
set\u
开头的任何方法。我也想到了一个修饰器,但你仍然需要定义它。你需要定义方法的名称(从
set
开始,你必须定义修饰器).为了不忘记decorator,最好是任何
set
方法自动调用基类中的某个方法。。。。
>>> from meta import Car
>>> c = Car()
>>> c._changed
False
>>> c.set_type("blah")
ok
>>> c._changed
True