zoukankan      html  css  js  c++  java
  • 学习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.
  • 相关阅读:
    Encrypted Handshake Message
    RSAParameters Struct
    What if JWT is stolen?
    What's the difference between JWTs and Bearer Token?
    RSA Algorithm Example
    第18届Jolt大奖结果公布
    Ruby on rails开发从头来(windows)(三十六) 调试技巧
    Ruby on rails开发从头来(四十二) ActiveRecord基础(主键和ID)
    YouTube开放基础技术架构 让用户建自家YouTube
    Ruby on rails开发从头来(四十) ActiveRecord基础(Boolean属性)
  • 原文地址:https://www.cnblogs.com/dadaizi/p/11964741.html
Copyright © 2011-2022 走看看