• 学习Python类的心得


     

    类的注意事项

    1)命名规则
    需要注意的是,在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,
    是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名。
     
    有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,
    但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,
    但是,请把我视为私有变量,不要随意访问”。
     
    双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。
    不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,
    仍然可以通过_Student__name来访问__name变量:
     
    >>> bart._Student__name
    'Bart Simpson'
    但是强烈建议你不要这么干,因为不同版本的Python解释器可能会把__name改成不同的变量名。
     
    总的来说就是,Python本身没有任何机制阻止你干坏事,一切全靠自觉。
    2)继承规则
    子类将继承父类的所有属性和方法,初始化init方法时,也得初始化所以的属性
     

    python继承

    1)子类继承父类
        编写类时,并非总是要从空白开始。如果你要编写的类是另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
    2)子类的init方法
        创建子类的实例时,Python首先需要完成的任务是给父类的所有属性赋值。为此,子类的方法 __init__() 需要父类施以援手。
    class Car():
    """一次模拟汽车的简单尝试"""
        def __init__(self, make, model, year):
            self.make = make
            self.model = model
            self.year = year
            self.odometer_reading = 0
     
        def get_descriptive_name(self):
            long_name = str(self.year) + ' ' + self.make + ' ' + self.model
            return long_name.title()
     
        def read_odometer(self):
            print("This car has " + str(self.odometer_reading) + " miles on it.")
     
        def update_odometer(self, mileage):
            if mileage >= self.odometer_reading:
                self.odometer_reading = mileage
            else:
                print("You can't roll back an odometer!")
     
        def increment_odometer(self, miles):
            self.odometer_reading += miles
     
    class ElectricCar(Car):
    """电动汽车的独特之处"""
        def __init__(self, make, model, year):
    """初始化父类的属性"""
            super().__init__(make, model, year)
     
    my_tesla = ElectricCar('tesla', 'model s', 2016)
    print(my_tesla.get_descriptive_name())
    
    3) python2中的继承
     
    4)给子类定义属性和方法
    让一个类继承另一个类后,可添加区分子类和父类所需的新属性和方法。下面来添加一个电动汽车特有的属性(电瓶),以及一个描述该属性的方法。我们将存储电
    瓶容量,并编写一个打印电瓶描述的方法:
    class Car():
        def __init__(self, make, model, year):
            self.make = make
            self.model = model
            self.year = year
            self.odometer_reading = 0
        -- snip --
    ​
    class ElectricCar(Car):
        """Represent aspects of a car, specific to electric vehicles."""
        def __init__(self, make, model, year):
            """
            电动汽车的独特之处
            初始化父类的属性,再初始化电动汽车特有的属性
            """
            super().__init__(make, model, year)
            self.battery_size = 70   # 1处
     
        def describe_battery(self):  # 2处
            """打印一条描述电瓶容量的消息"""
            print("This car has a " + str(self.battery_size) + "-kWh battery.")
    
    如果子类继承父类时,需要用到父类的属性或者方法,那么就需要调用父类的init方法
     
    class Thread:
        """
        xx1, xx2
        """
         def __init__(self, xx1, xx2):
                self.xx1 = xx1
                self.xx2 = xx2
     
    ​
    class MyThread(Thread):
        def __init__(self, xx1, xx2):
            super().__init__(xx1, xx2)  # 等价于super(MyThread, self).__init__()
            self.xx3 = "新增的属性3" 
            self.xx4 = "新增的属性4" 
     
    

     

    5)重写父类的方法
    对于父类的方法,只要它不符合子类模拟的实物的行为,都可对其进行重写。为此,可在子类中定义一个这样的方法,即它与要重写的父类方法同名。这样,Python将不会考虑这个父类方
    法,而只关注你在子类中定义的相应方法。
    假设 Car 类有一个名为 fill_gas_tank() 的方法,它对全电动汽车来说毫无意义,因此你可能想重写它。下面演示了一种重写方式:
    class ElectricCar(Car):
        -- snip --
        def fill_gas_tank():
            """电动汽车没有油箱"""
            print("This car doesn't need a gas tank!")
    
    例二, 子类必须全部显性的继承,并实现父类的属性

     
    class Father:
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
    ​
        def say(self):
            print("父亲会说话,我叫%s, 我的年龄是%d, 我的性别是%s" % (self.name, self.age, self.sex))
    ​
    ​
    class Child(Father):
        def __init__(self, name, age, sex, grade, play):
            super().__init__(name, age, sex)
            self.grade = grade
            self.play = play
    ​
        def say(self):
            print("孩子也会说话,我叫%s, 我的年龄是%d, 我的性别是%s, 我读%s, 我会玩%s" % (self.name, self.age, self.sex,
                                                                  self.grade, self.play))
    
    例三,子类可以隐形的继承父类的属性
    class Father:
        def __init__(self, name='', age=0, sex=''):
            self.name = name
            self.age = age
            self.sex = sex
    ​
        def say(self):
            print("父亲会说话,我叫%s, 我的年龄是%d, 我的性别是%s" % (self.name, self.age, self.sex))
    ​
    ​
    class Child(Father):
        def __init__(self, grade, play):
            super().__init__()
            self.grade = grade
            self.play = play
    ​
        def say(self):
            print("孩子也会说话,我叫%s, 我的年龄是%d, 我的性别是%s, 我读%s, 我会玩%s" % (self.name, self.age, self.sex,
                                                                  self.grade, self.play))
    if __name__ == '__main__':
        C = Child('二年级', 'play games')
        C.say()
    ​
    """
    孩子也会说话,我叫, 我的年龄是0, 我的性别是, 我读二年级, 我会玩play games
    """
     
    
    例四:
     
    class Father:
        def __init__(self, name='', age=0, sex=''):
            self.name = name
            self.age = age
            self.sex = sex
    ​
        def say(self):
            print("父亲会说话,我叫%s, 我的年龄是%d, 我的性别是%s" % (self.name, self.age, self.sex))
    ​
    ​
    class Child(Father):
        def __init__(self, grade, play):
            super().__init__()
            self.grade = grade
            self.play = play
    ​
        def say(self):
            print("孩子也会说话,我叫%s, 我的年龄是%d, 我的性别是%s, 我读%s, 我会玩%s" % (self.name, self.age, self.sex,
                                                                  self.grade, self.play))
    ​
    ​
    if __name__ == '__main__':
        C = Child('二年级', 'play games')
        C.name = '小明'
        C.age = 12
        C.sex = 'boy'
        C.say()
    # 孩子也会说话,我叫小明, 我的年龄是12, 我的性别是boy, 我读二年级, 我会玩play games
    

      

    Nobody knows it better than me.
  • 相关阅读:
    聊聊自学大数据flume中容易被人忽略的细节
    tomcat启动springboot war相关问题记录
    docker漏洞导致服务器沦为矿机
    docker 运行jenkins及vue项目与springboot项目(五.jenkins打包springboot服务且在docker中运行)
    docker 运行jenkins及vue项目与springboot项目(四.docker运行nginx)
    docker 运行jenkins及vue项目与springboot项目(三.jenkins的使用及自动打包vue项目)
    docker 运行jenkins及vue项目与springboot项目(二.docker运行jenkins为自动打包运行做准备)
    docker 运行jenkins及vue项目与springboot项目(一.安装docker)
    编译自己的jdk(使用openJDK源码编译jdk )
    docker 运行springboot jar包
  • 原文地址:https://www.cnblogs.com/dadaizi/p/11964741.html
Copyright © 2020-2023  润新知