类的注意事项
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