Pyhton 物件名可以直接作為方法名呼叫

2021-10-25 06:26:21 字數 2631 閱讀 2209

在建立cnn模型時,使用如下**,在構建方法裡面新建了一些物件,例如self.conv1,在下面的forward方法中直接把物件名作為方法名,傳入變數x

class net(nn.module):

def __init__(self):

super(net, self).__init__()

self.conv1=nn.conv2d(3,6,5)

self.pool=nn.maxpool2d(2,2)

self.conv2=nn.conv2d(6,16,5)

self.fc1=nn.linear(5*5*6,120)

self.fc2=nn.linear(120,84)

self.fc3=nn.linear(84,10)

def forward(self, x):

x=self.conv1(x)

x=self.conv1.forward(x)

x=f.relu(x)

x=self.pool(x)

x=self.pool(f.relu(self.conv2(x)))

x = x.view(-1, 16 * 5 * 5)

x=f.relu(self.fc1(x))

x=f.relu(self.fc2(x))

x=self.fc3(x)

return x

實際上x = self.conv1(x) 等價於 x = self.conv1.forward(x)

原因:self.conv1=nn.conv2d(3,6,5)

其中nn.conv2d是乙個類,繼承關係conv2d ——> _convnd ——> module。在建立module類時,定義了__call()__,說明 這個類及其子類的例項 都是是可呼叫的

def __call__(self, *input, **kwargs):

for hook in self._forward_pre_hooks.values():

hook(self, input)

if torch.jit._tracing:

result = self._slow_forward(*input, **kwargs)

else:

result = self.forward(*input, **kwargs)

for hook in self._forward_hooks.values():

hook_result = hook(self, input, result)

if hook_result is not none:

raise runtimeerror(

"forward hooks should never return any values, but '{}'"

"didn't return none".format(hook))

if len(self._backward_hooks) > 0:

var = result

while not isinstance(var, torch.tensor):

if isinstance(var, dict):

var = next((v for v in var.values() if isinstance(v, torch.tensor)))

else:

var = var[0]

grad_fn = var.grad_fn

if grad_fn is not none:

for hook in self._backward_hooks.values():

return result

使用x=self.conv1(x) 等價於呼叫了forward(),是因為:

module定義了forward(),conv2d, _convnd 繼承並改寫了forward()

在module的__call()__裡面寫了

....

result = self.forward(*input, **kwargs)

....

return result

所以,使用物件名作為方法名時,使用哪個方法,要看在 __call()__ 裡面怎麼寫的。

在這裡,呼叫的方法是 物件的 類的 forward()

做乙個簡單例子

class a():

def __init__(self):

self.a = 1

def func(self, input):

print('a_call '+ input)

def __call__(self, *args, **kwargs):

return self.func(*args)

class b(a):

def __init__(self):

super(b, self).__init__()

def func(self, input):

print('b_call ' + input)

a = a()

a('ok')

b = b()

b('ok')

輸出:

a_call ok

b_call ok

何種情況下可以用物件名直接訪問私有變數

私有成員變數的概念,在腦海中的現象是,以private關鍵字宣告,是類的實現部分,不對外公開,不能在物件外部訪問物件的私有成員變數 然而,在實現拷貝建構函式和賦值符函式時,在函式裡利用物件直接訪問了私有成員變數,因而,產生了困惑 下面以具體例項進行說明 class ctest ctest ctest...

資料庫物件名無效 解決方法總結

在資料庫裡面新建表後顯示物件名無效,但是在表中能看見,就是無法引用。強迫症 看著下劃線是一排紅色的 不爽 重啟sql服務也沒有用。暴力解決方法 關閉sql管理器,再重新開啟。紅色下劃線不見了 物件名無效也不見了 下面是看到其他人遇見的問題及解決見解,給大家參考 表在伺服器上沒有建立,於是俺開啟 sq...

物件作為方法的引數傳遞

士兵 事物名稱 士兵 soldier 屬性 姓名 name 身高 height 體重 weight 行為 打槍 fire 打 callphone 槍 事物名稱 槍 gun 屬性 彈夾 clip 型號 model 行為 上彈夾 addclip 彈夾 事物名稱 彈夾 clip 屬性 子彈 bullet ...