本篇内容是对参考链接内容的学习记录。
根据约定,在python中类的名称的首字母是大写的,当然,这只是约定,即类名称首字母也可是小写的。
1.类中的特殊方法__init__()
(1)在每次根据类创建实例时,都会被自动运行。
(2)类的各个属性都是在该方法中定义和初始化的。
(3)由于神经网络中一些结构的设置我们希望在创建实例时就有,所以这些设置一般都放在__init__()方法中
2.类中方法形参self
(1)类中定义的每一个方法都会有形参self,包括__init__()也有。
(2)它是一个指向实例本身的引用,作用在于让类方法通过实例来访问类中的属性和方法。
(3)调用与类相关联的方法时都将自动传递实参self
(4) 类中的方法的第一个参数一定要是self,而且不能省略。
class Person():
def __init__(self,name,age):
self.name=name
self.age=age
def printname(self):
print(self.name)
3.继承
一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法以区分子类和父类。
(1)创建子类时,父类必须包含在当前python程序文件中,且位于子类前面。
(2)定义子类时,必须在括号内指定父类的名称。
(3)将父类和子类关联起来的方法super(),super()调用于子类方法__init__中的首行: super().__init__(a,b,c) # 初始化父类的属性
,a,b,c由子类方法__init__()
提供。
class Person():
def __init__(self,name,age):
...
Class Teacher(Person):
def __init__(self,name,age,teachertitle):
super().__init__(name,age)
#参考链接2,上面这句也可以写成
#super(Teacher,self).__init__(name.age)
self.teachertitle=teachertitle
super(Net, self).init():
在神经网络中常看到super(Net, self).init()这句,是指首先找到Net的父类(比如是类NNet),然后把类Net的对象self转换为类NNet的对象,然后“被转换”的类NNet对象调用自己的init函数,其实简单理解就是子类把父类的__init__()放到自己的__init__()当中,这样子类就有了父类的__init__()的那些东西。
神经网络里常见的Net类继承nn.Module,super(Net, self).init()就是对继承自父类nn.Module的属性进行初始化。而且是用nn.Module的初始化方法来初始化继承的属性。
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
参考链接2中还有更多的例子可以参考。
4. __call__()方法
在定义类型的时候,实现__call__函数,这个类型就成为可调用的,换句话说,我们可以把这个类型的对象当作函数来使用,相当于重载了括号运算符。
class Person():
def __init__(self, name, age):
self.name = name
self.age = age
def __call__(self, friend):
print('My friend is %s...' % friend)
T=Person('dj',30)
T('mark') ###对象可以像函数一样
输出结果是:
文中若有不妥或错误之处,还望指出!