Python实例D

2020-11-25 10:27:41 发布

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

我想用一个来自“父”实例的decorator来装饰某些实例函数,有没有一种方法可以使用实例来装饰函数。在

以下是我需要做什么的想法

class Foo(object):

    def __init__(self):
        pass

    def set_configuration(self, function):
        def config(*args, **kwargs):
            # NOTE: this function needs to use instance variables.
            print 'foo ' + function()
        return config()

class Bar(object):

    def __init__(self, parent):
        self.parent = parent

    @self.parent.set_configuration
    def set_config_2(self)
        return 'bar'

foo = Foo()
foo.bar = Bar(foo)
foo.bar.set_config_2

编辑:

好吧,伙计们,这是真正的问题,我有一个设备,我需要互动。因此,一个设备可能有几个级别,即设备a 有多个接口,并且一个接口可以连接多个VLAN。所以我的想法是,如果我想改变一个接口上的vlan,而不是构建一个完整的命令,我希望允许父类处理它的命令级别的构建。所以我只想调用“change vlan”函数,它将把命令的一部分发送到下一个级别进行包装并发送到链上,直到它到达设备级别,完整的命令被发送到设备。在

^{pr2}$

我希望这更有意义。如果没有请告诉我。在

3条回答
网友
1楼 ·

不,不能在这里使用修饰符,因为在Bar的定义时间,父对象是未知的。在

{cd2>与参数一起使用:

class Foo(object):

    def __init__(self):
        pass

    def set_configuration(self, function):
        def config(*args, **kwargs):
            # NOTE: this function needs to use instance variables.
            print 'foo ' + function()
        return config

class Bar(object):

    def __init__(self, parent):
        self.parent = parent

    def set_config_2(self, args)
        def inner_function():
            return 'bar'
        return self.parent.set_configuration(inner_function)(args)


foo = Foo()
foo.bar = Bar(foo)
foo.bar.set_config_2(123)
网友
2楼 ·

Python是一种动态语言,所以很多事情都是可能的。我不评论这是不是一件好事-我真的不明白你的逻辑的目的。在

为了实现这一点,您需要在Bar.__init__中动态创建set_config_2,因为parent在类定义时是未知的:

from types import MethodType
class Foo(object):
    def __init__(self):
        pass

    def set_configuration(self, f):
        def config(inst, *args, **kwargs):
            print('foo', f(inst, *args, **kwargs))
        return config

class Bar(object):
    def __init__(self, parent):
        self.parent = parent
        @self.parent.set_configuration
        def set_config_2(inst):
            return 'bar'
        self.set_config_2 = MethodType(set_config_2, self)

foo = Foo()
foo.bar = Bar(foo)
foo.bar.set_config_2()

输出:

^{pr2}$

这是极其丑陋的,必须有更好的方法来做你正在尝试的。也许你可以问一个不同的问题来解释你想要达到的目标。在

网友
3楼 ·

您的decorator不必使用实例方法,因为需要实例方法的是包装函数config。因此,decorator不一定是方法。例如:

def set_configuration(func):
    @functools.wraps(func)  # copy function's metadata
    def wrapper(self, *args, **kwargs):
        # do whatever you want to fetch the config data
        return 'foo' + func(self, *args, **kwargs)

    return wrapper

也就是说,可能有一种更直接和明确的方法,这取决于你到底想要什么。在

相关问题