1、多态
在子类中重写父类的方法,用子类调用该方法,会执行子类重写的方法,用父类的对象调用,会执行父类的方法
class Animal: def foo(self): print("Animal") class Cat(Animal): def foo(self): print("Cat") class Dog(Animal): def foo(self): print("Dog") a = Animal() b = Cat() c = Dog() a.foo() b.foo() c.foo() # Animal # Cat # Dog
2、封装
把过程和数据包围起来,对数据的访问通过接口,不暴露实现过程
class Person: def setName(self,name): self.name = name def getName(self): return self.name def greet(self): print("Hello,world! I am %s." % self.name) foo = Person() bar = Person() foo.setName('Luke') bar.setName('Sky') foo.greet() # Hello,world! I am Luke. bar.greet() # Hello,world! I am Sky. ## 设置私有属性和方法 class Student(): __number = 20170719 name = "Chris" def __init__(self): print("我的学号%d"% self.__number) def __foo(self): print("我是私有方法") def printNumber(self): self.__foo() s = Student() # 我的学号20170719 # s.__foo() # error s.printNumber() # 我是私有方法 # print(s.__number) # error print(s.name) # Chris
3、继承
单继承 、多继承、类和类之间的关系、类和对象之间的关系
## 单继承 class Animal: def printName(self): print('Animal') class Dog(Animal): pass a = Animal() a.printName() # Animal d = Dog() d.printName() # Animal ## 多继承 class Person: def whoIAm(self): print('人类') class Child(Animal,Person): pass c = Child() c.printName() # Animal c.whoIAm() # 人类 ## 检测一个类是否是另一个类的子类 print(issubclass(Dog,Animal)) # True print(issubclass(Animal,Dog)) # False ## 已知类的基类 print(Dog.__bases__) # (<class '__main__.Animal'>,) print(Child.__bases__) # (<class '__main__.Animal'>, <class '__main__.Person'>) ## 一个对象属于哪个类 print(c.__class__) # <class '__main__.Child'> print(a.__class__) # <class '__main__.Animal'> ## 如果使用__metaclass__ = type 或者从object继承的方式来定义新式类,那么可以使用type(s)查看实例的类 class Tree: __metaclass__ = type t = Tree() print(type(t)) # <class '__main__.Tree'>
4、练习总结
class Calculator: def calculate(self,expression): self.value = eval(expression) class Talker: def talk(self): print('Hi,my value is',self.value) class TalkingCalculator(Calculator,Talker): pass tc = TalkingCalculator() tc.calculate('1+2*3') tc.talk() # Hi,my value is 7 # 检测方法是否存在 print(hasattr(tc,'talk')) # True print(hasattr(tc,'dfg')) # False ## 确定对象是否是类的实例 cc = Calculator() print(isinstance(tc,TalkingCalculator)) # True print(isinstance(tc,Calculator)) # True print(isinstance(cc,TalkingCalculator)) # False