用作 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
我正在写一个 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