import torch from torch import nn m = nn.Linear(20, 30) input = torch.randn(128, 20) output = m(input)
m是一个对象,这里为什么直接对一个对象传入参数呢??
这里为什么感觉对象和方法一样呢??
原因在这里:
所以对一个对象加括号相当于调用了object.call()函数,括号中还可以加参数
下面是一个示例:
class Product:
def __init__(self):
print("Instance Created")
# Defining __call__ method
def __call__(self, a, b):
print(a * b)
# Instance created
ans = Product()
#类实例化的时候要给类名加括号
# __call__ method will be called
ans(10, 20)
output:
Instance Created
200
下面再看一下torch源码:
相当于__call__和后面的函数等价
在这里做判断,满足条件时调用forward函数,这也就是为什么对一个对象可以直接输入tensor得到结果
- 魔术方法
在Python中,所有以双下划线__包起来的方法,统称为Magic Method(魔术方法),它是一种的特殊方法,普通方法需要调用,而魔术方法不需要调用就可以自动执行。
魔术方法在类或对象的某些事件出发后会自动执行,让类具有神奇的“魔力”。如果希望根据自己的程序定制自己特殊功能的类,那么就需要对这些方法进行重写。
"call"魔术方法其实命名已经很显然了,就是调用对象的时候调用;
就像init是初始化对象的时候调用
__len__(self) 定义当被 len() 调用时的行为(返回容器中元素的个数) __getitem__(self, key) 定义获取容器中指定元素的行为,相当于 self[key] __setitem__(self, key, value) 定义设置容器中指定元素的行为,相当于 self[key] = value __delitem__(self, key) 定义删除容器中指定元素的行为,相当于 del self[key] __iter__(self) 定义当迭代容器中的元素的行为 __reversed__(self) 定义当被 reversed() 调用时的行为 __contains__(self, item) 定义当使用成员测试运算符(in 或 not in)时的行为
python中能len,contains的对象,一定都有相应的魔术方法,也就是说只有定义了这些魔术方法,才能用len等
-
再一个就是继承,overload和其他
-
参数中**的含义



