面向对象的三大特征:封装,继承,多态。
面向对象与语言无关,是一种编程思想。
封装
实现:将数据和方法包装到类对象中,在方法内部对属性进行操作,在类对象的外部调用方法
实例:车的品牌
class Car:
def __init__(self, brand):
self.brand = brand
def start(self):
print(self.brand + '汽车已启动')
c = Car('Toyota')
c.start()
print(c.brand)
注:python中没有专门的修饰符用于属性的私有,如果不希望该属性在类对象的外部被访问,在前面加两个" _ "
class Car:
def __init__(self, brand):
self.__brand = brand
def start(self):
print(self.__brand + '汽车已启动')
c = Car('Toyota')
c.start()
print(c._Car__brand)
继承
- 如果一个类没有继承任何类,那么默认继承object
- Python支持多继承
- 定义子类时,必须在其构造函数中调用父类的构造函数
实例:创建学生和老师类,继承Person类
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def info(self):
print(self.name, self.age)
class Student(Person):
def __init__(self, name, age, stu_no):
super().__init__(name, age)
self.stu_no = stu_no
class Teacher(Person):
def __init__(self, name, age, tea_year):
super().__init__(name, age)
self.tea_year = tea_year
stu = Student('张三', 20, 1906100095)
tea = Teacher('李四', 39, 12)
stu.info()
tea.info()
多继承:
class A(object):
pass
class B(object):
pass
class C(A, B):
pass
方法重写
如果子类对继承自父类的某个属性或者方法不满意,可以在子类中对其进行重新编写 可以通过super.xxx( )调用被子类重写的方法
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def info(self):
print(self.name, self.age)
class Student(Person):
def __init__(self, name, age, stu_no):
super().__init__(name, age)
self.stu_no = stu_no
class Teacher(Person):
def __init__(self, name, age, tea_year):
super().__init__(name, age)
self.tea_year = tea_year
stu = Student('张三', 20, 1906100095)
tea = Teacher('李四', 39, 12)
stu.info()
tea.info()
上面的实例Student类和Teacher类调用Person中的info方法只能输出名字和年龄,不能输出自己新添加的(动态绑定)的属性。
下面重写了Student中的info方法,同理教师也是这种改法。
class Student(Person):
def __init__(self, name, age, stu_no):
super().__init__(name, age)
self.stu_no = stu_no
def info(self):
super().info()
print(self.stu_no)
在重写的代码行旁边会有提醒重写了父类:
多态
即便不知道一个变量所引用的对象到底是什么类型,仍然可以通过这个变量调用方法,在运行过程中根据变量所引用对象的类型,动态决定调用哪个对象中的方法。
class Animal:
def eat(self):
print('动物喜欢吃')
class Dog(Animal):
def eat(self):
print('狗喜欢吃骨头')
class Cat(Animal):
def eat(self):
print('猫喜欢吃鱼')
class Person:
def eat(self):
print('人类喜欢吃五谷杂粮')
def fun(obj):
obj.eat()
fun(Animal())
fun(Cat())
fun(Dog())
fun(Person())
上述代码中,fun(0)函数不管是Animal还是Cat和Dog和Person方法,都无区别的调用,只是因为它们都有eat()函数,这就是多态的体现。
补充: 静态语言和动态语言关于多态的区别: 静态语言实现多态的三个必要条件:继承,方法,重写。父类引用指向子类对象,使用前必须明确继承关系。(例如java) 动态语言的多态只关心对象的行为是否相像,而不关心对象的其他属性不用关系Person是谁的子类,只要Person有eat()行为即可。(例如python)
|