学习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

  

猜你喜欢

转载自www.cnblogs.com/dadaizi/p/11964741.html