一 python自动化基础能力:3.python基础上之数据类型,函数(18)


打印Tom
用了装饰器以后,
class Person():def __init__(self,name):self._name = name@propertydef name(self):print('The method is run')return self._namep = Person('Tom')print(p.name)
输出结果为:
The method is runTom
加入后,
class Person():def __init__(self,name):self._name = name@propertydef name(self):print('The method is run')return self._name@name.setterdef name(self,name):self._name = namep = Person('Tom')print(p.name)p.name = 'Jerry'print(p.name)
打印
The method is runTomThe method is runJerry
10.继承 10.1 引入
class Doctor():name = ''age = ''def treat(self):print('treat a patient')class soldier():name = ''age = ''def protect(self):print('Protect the people')
以上定义了两个类,但是又重复的属性name、age,如果每定义一个类都要分别定义这两个属性,很重复冗余,所以可以抽象出一个类来封装它们的公共属性和方法,即它们的父类这些类都继承自它们的父类 。

class Person():name = ''age = ''
10.2 继承的特点:
1.提高了代码的复用性;
2.让类与类之间产生联系,有了这个联系,才有了多态 。
继承是面向对象的三大特性之一,其他两个特性是封装、多态 。
定义一个动物类
class Animal:def run(self):print('Running...')def sleep(self):print('Sleeping...')a = Animal()a.run()
再定义一个狗类,
class Dog:def run(self):print('Running...')def sleep(self):print('Sleeping...')
这样定义狗类,有大量重复性代码,表现较差,我们应该使狗类继承自动物类,继承动物类的属性和方法 。
class Dog(Animal):passd = Dog()d.run()d.sleep()
打印
Running...Sleeping...
在定义类时可以在类名+括号,括号内的指定的是当前类的父类(超类、基类,super) 。
class Dog(Animal):def Housekeep(self):print('Housekeeping...')d = Dog()d.run()d.sleep()d.Housekeep()r1 = isinstance(d,Dog)r2 = isinstance(d,Animal)print(r1,r2)
打印
Running...Sleeping...Housekeeping...True True
显然,d既是Dog的实例,也是的实例,所以Dog也继承自了 。
如果在创建类的时候省略了父类,则默认父类是;
是所有类的父类,所有类都继承自 。
()检查一个类是否是另一个类的子类 。
class Animal:def run(self):print('Running...')def sleep(self):print('Sleeping...')class Dog(Animal):def Housekeep(self):print('Housekeeping')r1 = issubclass(Dog,Animal)r2 = issubclass(Animal,object)print(r1,r2)
证明了所有类都是的子类,所有对象都是的实例 。
10.3 方法的重写
如果在子类中有和父类重名的方法,通过子类的实例去调用方法时,会调用子类的方法而不是父类的方法,这个特点称为方法的重写(覆盖,) 。
如,