面向对象
什么是面向对象:
#面向对象
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)


浙公网安备 33010602011771号