用作 class 属性

Function as class attribute

我正在写一个 class,我想将函数作为 class 属性传递,稍后使用它,就像这样:

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' object has no attribute 'prenosna_funkcija'

是否可以这样做?

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

首先你使用了函数这个词,虽然它不是保留词,但应该避免将其用作变量等实体的名称。

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

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 它确实不存在。

你很接近:

def fun1(x):
return x+1

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

    def some_method(self):
        y = self.function(self.data1)
        return y

a = A(data1 = 41)
result = a.some_method()
print(result)

打印

42