面向对象初级

面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。

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

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

  • 面向对象编程不是所有的情况都适用 
  • class是关键字,表示类
  • 创建对象,类名称后加括号即可
  • class Foo:                            #创建类名 
        def bbb(self):                   #创建类的函数,也叫作方法
            print('bbbbbbbbb')        
        def ccc(self,name):           #(self) 特殊参数 必填的
            print(name)
    obj = Foo()                          # 创建对象 (创建类的实例)
    obj.bbb()                             #  调用对象 执行bbb方法
    obj.ccc('kaixin')

       面向对象:【创建对象】【通过对象执行方法】

    函数编程:【执行函数】

        场景不同那么适用编程的方式也不同

总结:函数式的应用场景 --> 各个函数之间是独立且无共用的数据

面向对象的三大特性是指:封装、继承和多态。

1,封装

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

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

class oldoby:
    def fetch(self):
        print(self.zzzz)
obj = oldoby()
obj.zzzz = 'www.000000.com'   #将值封装到类对象中,不需要再传参数了
obj.fetch()

    将内容封装到某处:

class oldoby:
    def __init__(self,bk):       #构造方法
        self.name = '开心'
        self.xixi = bk
        print(self.name,self.xixi)
obj = oldoby('zzzzzzzzz')      
obj1 = oldoby('xxxxxxxx')

特殊的参数:(self)self,形式参数,代指执行方法的对象。python内部传递

也就是说执行类中某一个方法,哪一个对象调用他,他就传递哪个对象!

obj = Foo()
obj.fetch('zz') ==> self:obj, backend:"zz"
obj1.fetch('xx') ==> self:obj1, backend:"xx"

类+括号 =》 自动执行类中的 __init__方法;创建了一个对象,在__init__方法中执行具体封装的操作

__init__ 有一个特殊名字:构造方法

__del__ 解释器销毁对象时候自动调用,特殊的名: 析构方法

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

调用被封装的内容时,有两种情况:

  • 通过对象直接调用
  • 通过self间接调用

1、通过对象直接调用被封装的内容

上图展示了对象 obj1 和 obj2 在内存中保存的方式,根据保存格式可以如此调用被封装的内容:对象.属性名

class oldoby:
    def __init__(self,bk):
        self.bobo = bk
foo = oldoby('xxxxxxxxx')
print(foo.bobo)
foo1 = oldoby('ssss')
print(foo1.bobo)
class oldboy:
    def __init__(self,name,age):
        self.Name = name
        self.Age = age

    def ren(self):
        print(self.Name)
        print(self.Age)
obj = oldboy('kaixin',20)
obj.ren()

综上所述,对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封装的内容。

函数式编程
def jieshao(self,tian,qi,hao):
    print('%s,%s%s,%s,喝酒去'%(self,tian,qi,hao))
jieshao('今天','心情','','')

面向对象
class lianxi:
    def kaiche(self,name,arg,gender):
        print("%s,%s岁,%s ,开车去山沟" %(name,arg,gender))
obj = lianxi()
obj.kaiche("老头",80,"")
函数编程 与 面向对象
小明,18,体重
吃 加 20 
减肥 减 10
喝  加   5   

class Person:
    def __init__(self,name,age,zhong):
        self.Name = name
        self.Age = age
        self.Zhong = zhong
    def chi(self):
        self.Zhong = self.Zhong + 20
    def jian(self):
        self.Zhong = self.Zhong - 10
    def he(self):
        self.Zhong = self.Zhong + 5
doo = Person('小明',18,150)
doo.chi()
doo.jian()
doo.jian()
doo.he()
print(doo.Name,doo.Age,doo.Zhong)
小练习

继承:面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容。

派生类(子类)可以继承基类(父类)的功能
class Foo:
    def fun(self):
        print('xxxxxxxx')

class XXX(Foo):
    def ccc(self):
        print(23212)
obj = XXX()
obj.fun()
obj.ccc()
继承
派生类 和基类同时存在,优先找派生类
class Aii:
    def chi(self):
        print(self.name + '')
class Bii(Aii):
    def __init__(self,name):
        self.name = name
    def chi(self):
        print(self.name + '')
    def jiao(self):
        print('爽歪歪')
bb = Bii('小明真会')
bb.chi()
bb.jiao()

执行结果:
小明真会叫
爽歪歪
python
asd
 
类可以同时继承多个类。而在(c#,Java)不可以
class Aii:
    def f1(self):
        print('Aii')
class A(Aii):
    def f(self):
        print('A')
class B(Aii):
    def f1(self):
        print('B')
class C(A):
    def f1(self):
        print('C')
class D(B):
    def f1(self):
        print('D')
class E(C,D):
    def f(self):
        print('E')
x = E()
x.f1()
多继承

继承的执行顺序

从左到右去执行, 哪个类调用self就传值给那个类 

方法从哪个调用的就执行哪个方法

class A:
    def bar(self):
        print('BAR')
        self.f1()
class B(A):
    def f1(self):
        print('B')
class C:
    def f1(self):
        print('C')
class D(C,B):
    pass
d1 = D()
d1.bar()
View Code

python2.7 继承流程

当未继承object时(经典类)深度优先继承:

继承object(新式类) 顶部最后(广度优先)

class bar:  #python2,7 #不继承一条道走到黑,继承新式类顶部最后 广度优先
    def f1(self):
        print 'bar'
class A(bar):
    def f(self):
        print 'a'
class B(bar):
    def f1(self):
        print 'b'
class C(A):
    def f(self):
        print 'c'
class D(B):
    def f1(self):
        print 'd'
class E(C,D):
    def f(self):
        print 'eeee'

e = E()
e.f1()
继承

     

执行父类的构造方式:

super(当前类,self).init()    执行父类的构造方式  类后面加括号自动执行
父类.__init__(self,xxx)     数据的初始化

class A:
    def __init__(self):
        print('A构造方法')
        self.tu = '000动物000'

class B(A):
    def __init__(self): 
        print('B构造方法')
        self.n = '000猫000'      
        super(B,self).__init__()     super(当前类,self).init()

b1 = B()
b1.tu
print(b1.__dict__)
View Code

三、多态 即是说多种形态

Pyhon不支持多态并且也用不到多态,多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型”。

class F1:
    pass


class S1(F1):

    def show(self):
        print ('S1.show')


class S2(F1):

    def show(self):
        print( 'S2.show')


# 由于在Java或C#中定义函数参数时,必须指定参数的类型
# 为了让Func函数既可以执行S1对象的show方法,又可以执行S2对象的show方法,所以,定义了一个S1和S2类的父类
# 而实际传入的参数是:S1对象和S2对象

def Func(F1 obj):
    """Func函数需要接收一个F1类型或者F1子类的类型"""
    
    print (obj.show())
    
s1_obj = S1()
Func(s1_obj) # 在Func函数中传入S1类的对象 s1_obj,执行 S1 的show方法,结果:S1.show

s2_obj = S2()
Func(s2_obj) # 在Func函数中传入Ss类的对象 ss_obj,执行 Ss 的show方法,结果:S2.show
多态
class F1:
    pass

class S1(F1):

    def show(self):
        print 'S1.show'

class S2(F1):

    def show(self):
        print 'S2.show'

def Func(obj):
    print obj.show()

s1_obj = S1()
Func(s1_obj) 

s2_obj = S2()
Func(s2_obj) 

Python “鸭子类型”

 查找源码的 过程:

查找源码的方法 (self.xxx()从底层开始找)从左到右 

import socketserver   #查找源码的过程
r = socketserver.ThreadingTCPServer()
r.serve_forever()

原文地址:https://www.cnblogs.com/guokaixin/p/5548277.html