zoukankan      html  css  js  c++  java
  • Python 私有、super用法 day7

    一、私有

    私有:某个类中,在变量或方法前面加__,就变成私有变量或私有方法。只能在这个类中使用

    class Person():
        def __init__(self):
            self.__money=5000   #在变量或函数前加__,就是私有变量。只能在类中使用。
        def __kiss(self):   #只能在类中使用
            print('kiss')
        def work(self):
            self.__money+=2000               #调用私有变量,也要加__
            self.balance()
        def shoulaji(self):
            self.__money+=5000          #调用私有变量
            self.balance()
            self.__kiss()   #调用私有方法
        def buy(self,consume):
            self.__money-=consume
            self.balance()
        def __beat(self):
            print('打他')
        def balance(self):  #在类中的方法不按顺序执行,是在实例化后,在类中找对应的方法
            print('现在还有多少钱%s'%self.__money)   #私有变量调用时也时self.__money
    syy=Person()
    # syy.__money-=10000    #类外部调用私有变量会报错
    syy.shoulaji()
    syy.balance()
    syy.buy(200)
    # syy.__kiss()   #私有变量、函数不能在外边直接调用

    二、super().__init__()用法

    一、何时要使用super.__init__():

      我理解是,当需要继承父类构造函数中的内容,且子类需要在父类的基础上补充时,使用super().__init__()方法。

     

    在这段代码中,New_person这个类即需要用到父类中name和age,又需要新增sex这个参数。这时就需要用到super().__init__()来继承父类中的name,和age。super().__init__()其实就是一个调用父类中__init__的函数。由于父类中的init有两个参数,所以super().__init__()也要传两个参数。

    通过子类中的__init__函数获取到传的参数,并传给父类,如图中的传值关系。

    当父类中的参数带有默认值时,super().__init__()调用父类中__init__也可以不传值(或传self),由于传值时self是可以省略的,所以写或不写结果是一样的。self在子类中代表子类本身,把self传到super().__init__()函数中,代表子类的__init__函数中的内容传给了父类。

    只不过是通过子类中重写后传到父类中的。既然已经在子类中重写了self.name 、self.age、self.sex,那再调用super().__init__()函数就是多此一举了。即使把super().__init__()这句代码删掉也是没有影响的。

    总之super().__init__()是为了继承父类中的__init__,继承后如果再子类中又重写那我觉得就是白继承了。。。

    源码在此,可以自己修改感受一下:

    class Person():
        def __init__(self,name,age):
            self.name=name
            self.age=age
        def name1(self,name):          #定义方法名时不要和变量名一样,否则在调用的时候可能会报错。
            print('方法中名字 %s'%name)
            print('类中的名字 %s'%self.name)
        def age1(self,age):
            print('方法中的年龄 %s' %age)
            print('类中的年龄 %s' %self.age)
    class New_person(Person):
        def __init__(self,new_name,new_age,sex):
            super().__init__(new_name,new_age)
            self.sex=sex
        def diaoyong(self,name,age):
            self.name1(name)
            self.age1(age)
        def sex1(self,sex):
            print('方法中的性别 %s' %sex)
            print('类中的性别 %s' %self.age)
    new_p=New_person('小花','20','')
    new_p.diaoyong('小米','15')
    new_p.sex1('')
    # new_p.name1('xiaohua')

    PS:还有就是,如果super().__init__()中,获取了子类中传的值,继承了父类。但是子类的__init__方法中,又把数据重写了,那再调用的时候,还是优先调用子类本身的值,如下图:

  • 相关阅读:
    SSRS 2012 创建ReportServer数据库失败: The RPC server is not listening. (Exception from HRESULT: 0x800706B3)
    关于SSIS包调用,把Execute out of Process 设成True后运行失败问题
    Mark:Insert, Update, and Delete Destination table with SSIS
    转SSIS 2012 pass values from child package to parent with project deployment model
    [转]SSIS Parameter和Variable的区别
    转SQL SERVER – SSIS Parameters in Parent-Child ETL Architectures – Notes from the Field #040
    简单的plsql to tsql ,游标拆解
    TSQL 根据表名生成UPDATE SELECT INSERT
    SPLIT CURSOR INTO ROWSET DML
    c/c++ tricks
  • 原文地址:https://www.cnblogs.com/candysalty/p/11243101.html
Copyright © 2011-2022 走看看