面向编程三大特性:封装(隐藏),继承,多态。
一. 封装
通过私有属性,私有方法的方式实现封装。
二. 继承
python支持多重继承,一个之类可以继承多个父类。
class 子类类名(父类1,父类2,…):
类体
父类名.__init__(self,参数列表)
1.成员继承:子类继承了父类除构造方法之外的所有成员。
2.方法重写:子类可以重新定义父类中的方法,这样就会覆盖父类中的方法,也称为重写。
通过类的方法**dir()**查看对象属性
重写__str__
方法:
用于返回一个对于“对象的描述”,对应于内置函数str()经常用于print()方法,帮助我们查看对象的信息。_str_()
可以重写。
三. 多态
多态是指同一个方法调用,由于对象不同可能会产生不同的行为。
1.多态是方法的多态,属性没有多态
2.多态的存在有两个必要条件:继承、方法重写
class Man:
def eat(self):
print("饿了,吃饭了!")
class Chinese(Man):
def eat(self):
print("中国人用筷子吃饭")
class English(Man):
def eat(self):
print("英国人用刀叉吃饭")
值得注意的是,python的多态和C++的多态是不一样的。在C++中,多态的目的则是为了接口重用。也就是说,不论传递过来的究竟是那个类的对象,函数都能够通过同一个接口调用到适应各自对象的实现方法。也就是说,C++会对传入的参数类型等进行判断来确定使用子类还是父类的方法。python只有重写,并不能对传入的参数类型进行判断。
class Operator():
def add(self, a, b):
if b == 0:
return a
sum = a ^ b
carry = (a & b) << 1
return self.add(sum, carry)
class StringOperator(Operator):
def __init__(self):
Operator.__init__(self)
def add(self, a, b):
return "".join([a,b])
def test():
a = 1
b = 2
op = StringOperator()
print(op.add(a,b))
test()
运行报错:
return "".join([a,b])
TypeError: sequence item 0: expected str instance, int found
也就是,python如果子类重写方法,就调用子类的方法,不会进行参数的类型判断等。
但,我们知道python的 +
号是可以同时处理,int型, str 型,实现原理很简单。就是 int 型和 str 型的实例属于不同的object,类本身会定义 __add__
方法去实现。也就是说, int 型的object用他内置的__add__
方法, str型也一样。
参考: