Python: 通过引用将类成员项传递给它的一个成员函数。

我在一个类中有一些函数,这些函数对类成员进行操作。这些函数除了操作的类成员外,几乎完全相同。为了避免重复输入函数,只改变被改变的类成员,我创建了一个函数,其中一个参数是要改变的类成员。

这里是一个非常简化的版本。

class Foo:
    a = 0
    b = 0

    def __set_member(self, member, value):
        member = value

    def set_a(self, value):
        self.__set_member(self.a, value)

f = Foo()

print(f.a)
f.set_a(2)
print(f.a)

但是这个输出:

0
0

在C++中,这可以用:

class Foo {

    void set_member(int& member, int value) {
        member = value;
    }

public:
    int a = 0;
    int b = 0;

    void set_a(int value) {
        set_member(this->a, value);
    }
};

很明显,我所举的例子不需要用到 “类成员”。set_member 函数,因为它非常简单。

在我的实际代码中,setter的样子是这样的。

def requestOpenDoor1(self):
    # Non blocking function: sets door1 to `Opening` and then after 2 seconds sets it to `Open`
    self.__door1 = DoorStates.Opening
    async def callback(): self.__door1 = DoorStates.Open
    self.__tasks.append(AsyncTimer(2, callback))

一种方法是把这个函数复制粘贴20多次,然后只修改被修改的类成员、过渡状态、时间和endState,但我宁愿减少代码的重复。

我也尝试过使用装饰器来解决这个问题。

class request_function_decorator(object):
    def __init__(self, tasks, stateToChange, transitionState, time, endState):
        self.__tasks = tasks
        self.__stateToChange = stateToChange
        self.__transitionState = transitionState
        self.__time = time
        self.__endState = endState
    def __call__(self, function):
        def wrapped_f(*args):
            self.__stateToChange = self.__transitionState
            async def callback(): self.__stateToChange = self.__endState
            self.__tasks.append(AsyncTimer(self.__time, callback))
        return wrapped_f

@request_function_decorator(__tasks, __door1, States.Opening, 2, States.Open)
def requestOpenDoor1(self):
    pass

但这也是行不通的。

如何将这个函数通用化,以减少代码的重复?

谢谢,我有一个类里面的一些函数。

解决方案:

你应该有 __setattr__ 的默认值。

class Foo:
    a = 0
    b = 0

f = Foo()
print(f.a)
# 0

f.a = 9
print(f.a)
# 9

f.__setattr__("a", 99)
print(f.a)
# 99

setattr(f, "a", 900)
print(f.a)
# 900

给TA打赏
共{{data.count}}人
人已打赏
解决方案

Python: 获取线对之间的距离

2022-4-22 14:08:53

解决方案

在spring boot微服务中,休息调用的调度不工作。

2022-4-22 15:02:50

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索