首页 > 解决方案 > 作为类属性的函数

问题描述

我正在编写一个类,我想将函数作为类属性传递并稍后使用它,如下所示:

class Nevronska_mreza:
    def __init__(self, st_vhodni, st_skriti, st_izhod, prenosna_funkcija=pf.sigmoid):
        self.mreza = []
        self.st_vhodni = st_vhodni
        self.st_skriti = st_skriti
        self.st_izhodni = st_izhod
        self.prenosna_funckija = prenosna_funkcija
        self.mreza.append([{'utezi': [random() for i in range(st_vhodni + 1)]} for j in range(st_skriti)])
        self.mreza.append([{'utezi': [random() for i in range(st_skriti + 1)]} for j in range(st_izhod)])

    def razsirjanje_naprej(self, vhod):
        for sloj in self.mreza:
            nov_vhod = []
            for nevron in sloj:
                nevron['izhod'] = self.prenosna_funkcija(self.aktivacijska_funkcija(nevron['utezi'], vhod))
                nov_vhod.append(nevron['izhod'])
            vhod = nov_vhod
        return vhod

但似乎这不是正确的方法,我收到以下错误:

AttributeError:“Nevronska_mreza”对象没有属性“prenosna_funkcija”

有可能做这样的事情吗?

标签: pythonclasshigher-order-functions

解决方案


是的,您可以将函数作为参数传递,但是您犯了几个错误。

首先,您使用了函数一词,尽管它不是保留词,但应避免将其作为实体名称,例如变量。

其次,您在强制参数之前使用了可选参数,这将导致错误,例如:

File "test.py", line 5
    def __init__(self, function=fun1, data1, data2):
            ^
SyntaxError: non-default argument follows default argument

第三,在调用方法时没有指定作用域,函数名在对象的自身作用域内。

考虑到所有这些,以下是工作代码

def fun1(x):
   return x+1

class A:
    def __init__(self, data1, data2, fn=fun1):
        self.fn = fn
        self.data1 = data1
        self.data2 = data2

    def some_method(self):
        y = self.fn(self.data1)
        print(y)

b = A(1, 2, fun1)
b.some_method()

发布完整代码后,我可以看到您当前在以下行中有 self.prenosna_funckija 而不是 prenosna_funkcija:

self.prenosna_funckija = prenosna_funkcija

这可以解释属性错误,因为当您调用 self.prenosna_funkcija 时,它确实不存在。


推荐阅读