Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 防止类';将函数属性作为第一个参数传递给self_Python_Oop_Syntax - Fatal编程技术网

Python 防止类';将函数属性作为第一个参数传递给self

Python 防止类';将函数属性作为第一个参数传递给self,python,oop,syntax,Python,Oop,Syntax,好的,我有一个类,其中一个属性是回调函数。问题是,无论何时我从类内调用它(例如,作为self.function\u attr()),它都会作为第一个参数传递给self。下面是我的工作思路: def callback(a, b): # do something with a, b class A: def __init__(self, callback): self.callback = callback self.callback(1, 2) #

好的,我有一个类,其中一个属性是回调函数。问题是,无论何时我从类内调用它(例如,作为
self.function\u attr()
),它都会作为第一个参数传递给
self
。下面是我的工作思路:

def callback(a, b):
    # do something with a, b

class A:
    def __init__(self, callback):
        self.callback = callback
        self.callback(1, 2) # Raises a TypeError: takes exactly 2 arguments (3 given)
我不愿意编写每个回调函数来将
self
作为第一个参数。我编写了一个装饰程序来解决这个问题:

def callback_decorator(func):
    def newfunc(self, *args, **kw):
        return func(*args, **kw)
    return newfunc
但我想知道有没有更好的


基本上,我的问题是,我如何调用类的实例属性(这些属性是函数),而不将它们作为第一个参数传递给
self

据我所知,包装器(比如你的装饰器)是最简单的方法。既然你已经有了一个存储函数的对象,我就不需要装饰器了。(注意,我继承了
对象
,这可能是您应该做的事情,除非您特别想要旧式的类行为。)

这与您期望的一样:

>>> def f(x, y):
...     print "X: %s, Y: %s" % (x,y)
... 
>>> mya = A(f)
X: 1, Y: 2

当您将它绑定到类时,只需将其设置为staticmethod

def callback(a, b):
    # do something with a, b

class A:
    def __init__(self, callback):
        # now it won't get passed self
        self.callback = staticmethod(callback)
        self.callback(1, 2)


是的,我的实际类是新样式的,我的示例可能不在一些较旧的Python版本上:)这比我一直在做的要好。肯定会减少代码重复。
def callback(a, b):
    # do something with a, b

class A:
    def __init__(self, callback):
        # now it won't get passed self
        self.callback = staticmethod(callback)
        self.callback(1, 2)
class A:
    def __init__(self, callback):
        self.callback(1, 2)

    # now it won't get passed self
    callback = staticmethod(callback)