面向对象

面向过程:根据业务逻辑从上到下写垒代码

函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可

def email(em,text):
    """
    发送邮件
    :return:
    """
    print(em,text)

def msg(tel,text):
    """
    发送短信
    :return:
    """
    print(tel,text)

def wechat(num,text):
    """
    发送微信
    :return:
    """
    print(num,text)

  

面向对象:对函数进行分类和封装。

class Message:
    def email(self, em, text):
        """
        发送邮件
        :return:
        """
        print(em,text)
    
    def msg(self, tel, text):
        """
        发送短信
        :return:
        """
        print(tel,text)
    
    def wechat(self, num, text):
        """
        发送微信
        :return:
        """
        print(num,text)
View Code

 

创建类和对象

类就是一个模板,模板里可以包含多个函数,函数里实现一些功能

对象则是根据模板创建的实例,通过实例对象可以执行类中的函数

定义:
class 类名: - 定义了一个类

def 函数名(self): - 在类中编写了一个"方法"
pass
调用:
x1 = 类名() - 创建了一个对象/实例化一个对象
x1.函数名() - 通过对象调用其中一个方法.

 

构造方法的目的是进行数据初始化。通过构造方法,可以将数据进行打包,以后使用时,去其中获取即可

class Fir:
    def __init__(self,name,age):   #称为构造方法,根据类创建对象时自动执行
        self.name = name
        self.age = age

obj1 = Fir('zhh',18)
obj2 = Fir('zhangqiang',73)

self 是一个形式参数,当执行 obj1 = Foo('zhh', 18 ) 时,self 等于 obj1
当执行 obj2 = Foo('zhangqiang', 73 ) 时,self 等于 obj2

 

应用 1 将数据封装到对象中,以供自己在方法中调用

class FileHandler:
    def __init__(self,file_path):
        self.file_path = file_path
        self.f = open(self.file_path, 'rb')

    def read_first(self):
        # self.f.read()
        # ...
        pass

    def read_last(self):
        # self.f.read()
        # ...
        pass

    def read_second(self):
        # self.f...
        # ...
        pass

obj = FileHandler('C:/xx/xx.log')
obj.read_first()
obj.read_last()
obj.read_second()
obj.f.close()

 

2将数据封装到对象中,以供其他函数调用

def new_func(arg):
    arg.k1
    arg.k2
    arg.k6

class Foo:
    def __init__(self,k1,k2,k6):
        self.k1 = k1
        self.k2 = k2
        self.k6 = k6

obj = Foo(111,22,333)
new_func(obj)

 

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

封装

顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。

所以,在使用面向对象的封装特性时,需要:

  • 将内容封装到某处
  • 从某处调用被封装的内容

第一步:将内容封装到某处

class Person:
    def __init__(self,name,age,gender):
        self.name = name
        self.age = age
        self.gender = gender

obj = Person('孙福来',18,'')

第二步:从某处调用被封装的内容

通过self调用

class Person:
    def __init__(self,name,age,gender):
        self.name = name
        self.age = age
        self.gender = gender

    def detail(self):
        print(self.name)
        print(self.age)

obj = Person('孙福来',18,'')
obj.detail()

通过直接调用

class Person:
    def __init__(self,name,age,gender):
        self.name = name
        self.age = age
        self.gender = gender

obj = Person('孙福来',18,'')
print(obj.name)     #直接调用object对象的name属性

 

继承

将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法。实现代码的复用

继承的编写

class(父类):

  pass

支持多继承(从左到右查找)

class Base1:
    def show(self):
        print('Base1.show')

class Base2:
    def show(self):
        print('Base2.show')

class Foo(Base1,Base2):
    pass

obj = Foo()
obj.show()

 多继承查找顺序

a. 先找左再找右
class A(object):
    pass


class B(object):
    def f1(self):
        print('B')


class C(A,B):
    pass

obj = C()

obj.f1()
b. 经典类和新式类
py2:
经典类
新式类,如果自己或自己的前辈只要有人继承object,那么此类就是新式类。
py3:
新式类

经典类和新式类的查找成员的顺序不一样。
经典类,一条道走到黑(深度优先)。
新式类,C3算法实现(python2.3更新时c3算法)。
Foo + (C,D,F,G) + (G,D,G,W) + (I,G,D,G,W) 
获取第一个表头 和 其他表位进行比较
不存在则拿走。
如果存在,则放弃,然后获取第二个表的表头再次和其他表的表尾进行比较。


posted @ 2018-08-27 17:23  xihuxiangri  阅读(111)  评论(0编辑  收藏  举报