python 面向对象(一)

 

一、创建类和对象                                            

#编写一个类
class Func:                       #定义了一个类
    def __init__(self,name):   # 构造方法
        self.name = name
    def f1(self):                 #在类中编写了一个方法
        pass
#执行类中方法的流程:
    obj = Func("Tom")       #实例化一个对象
    obj.f1()                        #通过这个对象调用方法

 如何归类:
     正向:归类+提取公共值
   反向:类的相关功能+提取公共值

构造方法:

class Person:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender
obj = Person("Tom", 20, "")


  1.构造方法目的是将数据进行初始化。
  2.应用:
    1.将数据封装到对象中,以供自己在方法中调用。
    2.将数据封装到对象中,以供其他函数调用。

self

  self是一个形式参数,当实例化一个对象 obj = Foo()时,self 就等于 obj

二、面向对象的三大特性:封装/继承/多态            

1.封装  


1.将相关功能封装到一个类中

class Message:
def emall(self):
pass
def mage(self):
pass
def wechat(self):
pass

 

2.将数据封装到一个对象中

#继承编写:
class A:         #父类/基类
    def f1(self):
        print("A1")

    def f3(self):
        print("A3")

class B(A):     #子类/派生类
    def f1(self):
        print("B1")

    def f2(self):
        self.f3()
        print("B2")

obj = B()
obj.f2()

 

原则:在自己类中找,没有就去父类找。

多继承

  python支持多继承,(父类1,父类2)先找左边。

class A:
    def f1(self):
        print("A1")
    def f3(self):
        print("A3")

class B:
    def f1(self):
        print("B1")
    def f2(self):
        self.f1()
        print("B2")

class C(A,B):
    def func(self):
        self.f2()
        print("func")

obj = C()
obj.func()

  多继承提高代码重用性。

补充:

  经典类和新式类

    python2 中 有经典类和新式类,如果自己或自己的基类中有人继承了object,那就是新式类,如果没有人继承就是经典类

    python3中没有了经典类和新式类之分,只有新式类,如果类没有继承的父类,则自动继承object

  经典类和新式类的查找顺序

    经典类:深度优先

    新式类C3算法

  C3算法:

 

class A(object):
    pass
class B(A):
    pass
class C(A):
    pass
class D(B, C):
    pass
obj = D()
#D类的查找顺序:L(D) = (D,B,A,object) + (D,C,A,object)
#D,B,C,A,object

print(D.__mro__)

 

    原理:获取第一个表头,和其他表尾巴进行比较,不存在则拿走,如果存在则放弃,然后获取第二个表的表头,再次和其他表的表尾进行比较。

 

  __mro__ :也可以使用__mro__ 方法,来查看查找顺序。

  注意事项:

    super是遵循了__mro__执行顺序

   


3.多态   


  多种形态或多种状态
  鸭子模型,只要可以嘎嘎叫就是鸭子
  由于python原生支持多态,所以没有特殊性

class Foo1:
    def f1(self):
        pass

class Foo2:
    def f1(self):
        pass

class Foo3:
    def f1(self):
        pass

def func(arg):
    arg.f1()

obj = Foo1()  # obj= Foo2()   obj = Foo3()
func(obj)

 



posted @ 2018-08-27 20:43  AndyStrack  阅读(195)  评论(0编辑  收藏  举报