17面向对象--三大特性
python的三个特性:封装、继承、多态
封装:
将相关功能封装到一个类
将数据封装到一个对象(__init__)
# 1、功能的封装 class Loy2: def testmethod1(self, name, data, gender): data = '%s%s%stest1' % (name, data, gender) print(data) def testmethod2(self, name, data, gender): data = '%s%s%stest2' % (name, data, gender) print(data) def testmethod3(self, name, data, gender): data = '%s%s%stest3' % (name, data, gender) print(data) obj1 = Loy2() obj1.testmethod1('别人', '明天', '上班') obj1.testmethod2('别人', '明天', '上班') obj1.testmethod3('别人', '明天', '上班') # 2、优化版本(参数的打包) class Loy: def __init__(self, a, b, c): self.n1 = a self.n2 = b self.n3 = c def testmethod1(self): data = '%s%s%stest1' % (self.n1, self.n2, self.n3) print(data) def testmethod2(self): data = '%s%s%stest2' % (self.n1, self.n2, self.n3) print(data) def testmethod3(self): data = '%s%s%stest3' % (self.n1, self.n2, self.n3) print(data) obj = Loy('我自己', '今天', '去打牌') obj.testmethod1() obj.testmethod2() obj.testmethod3()
继承:
继承的目的是为了复用
多继承:
不同于其他语言,在python中,一个派生类可以继承多个基类,多继承(先找左,再找右),多继承可以提高复用性
class Base1: def f1(self): print('base1.f1') def f2(self): print('base1.f2') class Base2: def f1(self): print('base2.f1') def f2(self): print('base2.f2') def f3(self): print('base2.f3') self.f1() class Foo(Base1, Base2): def f0(self): print('foo.f0') self.f3() obj = Foo() obj.f0()
以上代码打印结果为
当运行obj对象的f0方法时,首先在本身的Foo类中寻找f0打印第一行。然后f0中调用了f3,f3在Foo类中没有,然后在继承
的Base1类中找f3,没找到。然后在Base2类中找f3。打印第二行。然后f3调用了f1(注意:此时self.f3()中的self指向依旧是obj)。
然后Foo类中没有找到f1,然后在Base1类中找到,打印第三行,至此结束。
多态:
# 关于多态,网上的说法众说纷纭,Google了半天。发现大佬们说的都过于抽象。鉴于我自己还不是个老油条。后续醍醐灌顶之后再补充。
多种形态或者多种状态,多态可以增加代码的灵活度。
鸭子模型:在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的
class Base(object): def fun(self): print('这是一个基类') class Foo(Base): def fun(self): Base.fun(self) print('这是派生类1') class Foo2(Base): def fun(self): Base.fun(self) print('这是派生类2') a = Base() b = Foo() c = Foo2() a.fun() b.fun() c.fun() ''' 打印结果如下: 这是一个基类 这是一个基类 这是派生类1 这是一个基类 这是派生类2 '''
以上就是个人对于python基础三大特性的了解。如有问题,欢迎指正。