super().__init__()的用法
--super(),会得到一个特殊的对象,该对象就是专门用来 访问父类中的属性的(严格按照继承的关系) --super().__init__(),
这里__init__()括号中不需要传参self, 有其他参数传其他参数即可 --在Python2中,super()的完整用法是 super(自己的类,self).__init__(),
在Python2中需要写完整,而Python3中可以简写为 super().__init__()。
--用法解析:
在子类的__init__方法中使用 super().__init__() , 就相当于把父类的 __init__构造方法拿过来用, 并且可以对父类的__init__方法进行补充(比如添加成员属性/方法) ,
也就相当于把父类的__init__方法继承过来了, 之后用子类实例化一个对象后, 这个对象可以点出父类对象的成员属性/方法, 当然也可以点出自己类对象的成员属性/方法
原本的话子类中的__init__方法会覆盖掉父类的__init__方法, 导致无法通过实例化子类的类对象去给父类的类对象添加成员属性/方法,也无法调用父类类对象的属性/方法
"""普通情况""" class OldboyPeople: school='oldboy' def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex class OldboyStudent(OldboyPeople): def __init__(self,name,age,sex,stu_id): self.stu_id=stu_id def choose_course(self): pass obj2 = MyClass2("chen",12,1,"123") # 虽然接收了这些参数,但是并没有给对象添加属性 # print obj2.name # 会报错,子类的类对象没有name属性 print(obj2.__dict__) # {"stu_id":"123"} # 如果把子类的__init__方法注释掉,实例化传参obj2 = MyClass2("chen",12,1),就会调用父类的__init__方法,也就是说通常情况下,父类的__init__方法和子类的__init__方法只能用一个 """使用super().__init__()后""" class OldboyPeople: school='oldboy' def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex class OldboyStudent(OldboyPeople): def __init__(self,name,age,sex,stu_id): super().__init__(name,age,sex) self.stu_id=stu_id def choose_course(self): print('%s is choosing course'%self.name) # return 'true' # 函数自带返回值none,如果把return 'true'这一行注释的话, # 那么打印的print(stu1.choose_course())这个结果就会是:tank is choosing course # 并且还会打印出有None。 stu1=OldboyStudent('tank',19,'male',1) print(stu1.__dict__) print(stu1.choose_course()) 上述程序输出的打印结果如下所示: {'name': 'tank', 'age': 19, 'sex': 'male', 'stu_id': 1} tank is choosing course None
介绍一种特殊用法 super(dict, self).__init__()
# 下面的代码是基于python2运行的, 如果用python3,则也可以将 super(dict, self).__init__() 简写成 super().__init__()
class MyClass1(object): age = 18 def __init__(self): self.name = "chen" class MyClass2(MyClass1): def __init__(self): super(MyClass2, self).__init__() # self["key1"] = 666 # 会报错'MyClass2' object does not support item assignment self.sex = "男" class MyClass3(dict): def __init__(self): super(dict, self).__init__() # 注意第一个参数是dict,而不是自己的类 self["key1"] = 666 self.sex = "女" obj2 = MyClass2() print obj2.name, obj2.age, obj2.sex # chen 18 男 obj3 = MyClass3() print obj3.sex # 女 print obj3["key1"] # 666
Myclass3 继承了dict类. 并且在__init__方法中使用 super(dict, self).__init__() ,使得Myclass3实例化的类对象具有dict字典的特征
即可以对Myclass3类对象进行字典操作, 比如添加键值对, 通过键取值等等