面向对象

什么是面向对象:

#面向对象
class SQLHelper:
    def fetch(self, sq1):
        print(sq1)
        print(self.hhost)                #执行被封装的函数hhost
        print(self.uusername)            #执行被封装的函数uusername
        print(self.pwd)                  #执行被封装的函数pwd
    def create(self, sq1):
        pass
    def remove(self, nid):
        pass
    def modify(self, name):
        pass
obj = SQLHelper()
obj.hhost = ("cl.star.com")             #代表把参数传入 hhost 中封装
obj.uusername = ("Guido")               #代表把参数传入 uusername 中封装
obj.pwd = ("123")                       #代表把参数传入 pwd 中封装
obj.fetch("select*from A")             #执行对象obj的fetch方法,将封装的参数传入self中,(" ")中的参数传入sq1

 

什么时候用面向对象:

      当某一些函数具有相同参数时,可以使用面向对象的方式,将参数的值一次性封装在对象里,以后到对象中直接取值。

 

self是什么:

      self是一个python会自动传值得形式参数,哪个对象执行该方法,self就是那个对象。

obj1.fetch("kdi")     self = obj1
obj2.fetch("kdi")     self = obj2

 

构造方法:

  类中有一个特殊的方法__init__,类()时对象被建立 __init__就会自动被执行

  这个方法可以用来对你的对象做一些你希望的初始化。注意,这个名称的开始和结尾都是双下划线。

class SQLHelper:
    def __init__(self, a1, a2, a3):    #封装数据
        print("自动执行__init__")
        self.hhost = a1                #a1 = slkj.com   self = obj1
        self.uusername = a2            #a2 = Guido  self = obj1
        self.pwd = a3                  #a3 = 123    self = obj1
    def fetch(self, sq1):          #sq1 = select*from A
        pass
    def remove(self, nid):
        pass
    def modify(self, name):
        pass
obj1 = SQLHelper("slkj.com", "Guido", 123)
obj1.fetch("select*from A")

 

类与对象的关系:

两种类型的域——

        类的变量和对象的变量,它们根据是类还是对象拥有这个变量而区分。

类的变量:由一个类的所有对象(实例)共享使用。只有一个类变量的拷贝,所以当某个对象对类的变量做了改动的时候,这个改动会反映到所有其他的实例上。

对象的变量:由类的每个对象(实例)拥有。因此每个对象有自己对这个域的一份拷贝,即他们不是共享的,在同一个类的不同实例中,虽然对象的变量有相同的名称,但是是互不相关的。

面向对象的三大特性:

封装、继承、多态

  封装:

class c1:
    def __init__(self, name, obj):
        self.name = name
        self.obj = obj
class c2:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def show(self):
        print(self.name)
class c3:
    def __init__(self, a1):
        self.money = 123
        self.aaa = a1
c2_obj = c2("aa", 11)                #c2_obj是c2的类,name="aa",age=11
c1_obj = c1("Guido", c2_obj)         #c1_obj是c1类型,name="Guido",obj=c2_obj
print(c1_obj.obj.age)
c3_obj = c3(c1_obj)                  #c1_obj=a1
print(c3_obj.aaa.name,type(c3_obj.aaa.name))

 

继承:

面向对象编程带来的好处之一就是代码重用,实现这种方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Guido's admirers


class We:
    def __init__(self, name):
        self.name = name

    def li(self):
        print("TT", self.name)


class No(We):
    def __init__(self, age, name):
        We.__init__(self, name)
        self.age = age

    def MM(self):
        print("Good", self.name, self.age)

obj = No("guido", 27)
obj.MM()


执行结果:
Good 27 guido

  

单继承:

相当于把父类写入子类里

class F1:
    def show(self):
        print("show")
    def foo(self):
        print(self.name)
class F2(F1):                     #子类,派生类
    def __init__(self, name):
        self.name = name
    def bar(self):
        print("bar")
    def show(self):
        print("F2.show")
obj = F2("Guido")
obj.show()                       #优先执行本类中的同名方法
obj.foo()

class S1:
    def F1(self):
        self.F2()
    def F2(self):
        pass
class S2(S1):
    def F3(self):
        self.F1()
    def F2(self):
        pass
obj = S2()
obj.F3()
obj1 = S1()
obj1.F1()
#执行过程中子类中没有的方法去父类里找,父类中与子类中同时有的方法,子类中的方法优先执行。

 

多继承:

class c3(c1,c2)

 

 

多态:

多种形态,多种类型

def func(arg):
    print(arg)
func(1)              #对对象进行封装时数据可以是多种类型
func("Guido")
func([11, 22, 33])

 在:c#与java中没有多态,指定形式参数时要指出参数类型,只能通过类的继承增加多态的形式,类与该类的子类。

#此代码只做演示便于理解,不是正确的。
def func(int arg):
    func(123)
    func("Guido")      #报错
    
class A:
    pass
class B(A):
    pass
class C(A):
    pass
def func(A, arg):    #aeg参数:必须是A类型或A的子类型
    print(arg)
obj = A(arg)
func(obj)

 

posted @ 2016-11-24 11:22  橡皮头  阅读(306)  评论(0编辑  收藏  举报