1. 继承
- 子类可以有多个直接父类。
**class A(B,C,D...):**
在多继承机制详解(以后找时间更新) - 子类继承父类除私有方法外所有的属性和方法。假如多个父类包含同名的属性或者方法,则子类优先调用排在最前面的父类的属性或者方法。
- 子类也可以重写从父类继承过来的所有方法。
- 子类没有重写父类的构造方法,子类初始化时会自动调用父类的构造方法。
在子类中如何调用父类的方法:
class Human:
def __init__(self,name,age):
self.name = name
self.age = age
class Student(Human):
def __init__(self,school,name,age):
self.school = school
Human.__init__(self,name ,age) # 此时是将__init__()方法视为普通方法,并不是构造方法。所以需要自己传入self。
# super(Student, self).__init__(name,age)
def do_homework(self):
print('english homework')
student1 = Student("小学",'小明',12)
Student.do_homework(student1) # 多此一举,没有意义
student1.do_homework()
class Human:
def __init__(self,name,age):
self.name = name
self.age = age
def do_homework(self):
print("It is a parent method")
class Student(Human):
def __init__(self,school,name,age):
self.school = school
super(Student, self).__init__(name,age)
def do_homework(self):
super(Student, self).do_homework()
print('english homework')
student1 = Student("小学",'小明',12)
student1.do_homework()
2. 多态
在java这种强类型语言中,实例化类时,定义的类型与运行时的类型不一致就是多态。比如 **Animal a = new cat() // Cat是Animal的子类**
。
python中的多态与java中的多态不同:
- 不同类含有功能不同但函数名相同的函数。
- 只关心对象的实例方法是否同名,不关心对象所属的类型
- 对象所属的类之间,继承关系可有可无
- python的多态指的是调用方法的技巧,java多态注重的是类的类型不同 ```python from abc import ABCMeta,abstractmethod #(抽象方法)
class Payment(metaclass=ABCMeta): # metaclass 元类 metaclass = ABCMeta表示Payment类是一个规范类 def init(self,name,money): self.money=money self.name=name
@abstractmethod # @abstractmethod表示下面一行中的pay方法是一个必须在子类中实现的方法
def pay(self,*args,**kwargs):
pass
class AliPay(Payment):
def pay(self):
# 支付宝提供了一个网络上的联系渠道
print('%s通过支付宝消费了%s元'%(self.name,self.money))
class WeChatPay(Payment):
def pay(self):
# 微信提供了一个网络上的联系渠道
print('%s通过微信消费了%s元'%(self.name,self.money))
class Order(object):
def account(self,pay_obj):
pay_obj.pay()
pay_obj1 = WeChatPay(“wang”,100) pay_obj2 = AliPay(“zhang”,200)
order = Order() order.account(pay_obj1) order.account(pay_obj2)
```python
class Duck():
def walk(self):
print('I walk like a duck')
def swim(self):
print('i swim like a duck')
class Person():
def walk(self):
print('this one walk like a duck')
def swim(self):
print('this man swim like a duck')
class WhoSwim:
def swim(self,who):
who.swim()
ws = WhoSwim()
ws.swim(Duck())
ws.swim(Person())
3. 鸭子类型/鸭子模型
鸭子模型是python编程的一种风格。在鸭子类型当中,关注点在于对象的行为能做什么,而不是关注对象所属类的类型。
其实在面试当中,面试官问到鸭子模型,就是考察python多态。