一、类和对象
#创建类,类名为mailclass mail:#【方法】 def email(self,mail,neirong): print("收件人: ",mail,"\n内容: ",neirong) return True #如果不定义返回值,默认为None#【调用】obj = mail() #创建对象,对象名objobj.email('Admin','你好,请查收附件表格。') #通过对象执行方法注:当执行obj = mail()时,类对象指针将obj指向了类mail。
二、面向对象
概念:面向对象是一种编程方式,需要类和对象来实现。
类就是一个模板,模板里包含多个函数,函数里实现一些功能。
对象是根据类创建的一个实例,通过实例对象可以执行类中的函数。
面向对象也是对函数或事物进行分类和封装。
面向对象三大特性:
封装,继承,多态
1.函数式编程和面向对象编程对比
函数式编程
def add(host,username,passwd): print(host,username,passwd,"add")def remove(host,username,passwd): print(host,username,passwd,"remove")def modify(host,username,passwd): print(host,username,passwd,"modify")def select(host,username,passwd): print(host,username,passwd,"select")#执行函数add('host.com','admin','123')remove('host.com','admin','123')modify('host.com','admin','123')select('host.com','admin','123')
面向对象编程
class SQLHelper: def fetch(self, sql): print(self.hhost) print(self.uuserane) print(self.pwd) def create(self, sql): pass def remove(self, nid): pass def modify(self, name): passobj1 = SQLHelper()#以下定义的值被封装到对象obj1中,在类中可以直接调用。obj1.hhost = "c1.salt.com"obj1.uuserane = "alex"obj1.pwd = "123"obj1.fetch("select * from A")2.什么情况下适合使用面向对象? 当某一些函数具有相同参数时,可以使用面向对象的方式,将参数值一次性的封装到对象,以后去对象中取值即可。
三、self是什么?
self是一个python会自动给传值的参数。哪个对象执行方法,self就是谁。obj1.fetch(.....) self = obj1
四、构造函数
类中有一个特殊的方法,叫__init__方法。当python解释器遇到类名加()时,会自动执行这个类的init方法class S1: def __init__(self): print('自动执行init')obj = S1()
五、封装
封装:将内容封装到某个地方,以后再去调用被封装在某处的内容
将内容封装到某处
从某处调用被封装的内容
对象可以封装任何类型的数据
1.封装字符串
class sql: def __init__(self,a,b,c): #构造方法,通过类创建对象时自动执行 print("自动执行init") self.hhost = a self.uusername = b self.ppasswd = c def create(self,sql): print(self.uusername) def select(self,sql): print(self.ppasswd)obj1 = sql('admin.com','admin',123) #将三个值分别封装到obj1(self) a,b,c属性中obj1.select("select * from S")#调用print(obj1.hhost)print(obj1.uusername)print(obj1.ppasswd)
2.封装对象
#把对象c2_obj封装到c1_obj对象中,并赋值给c1类中的obj属性class c2: def __init__(self,name,age): self.name = name self.age = age#方法里面没有返回值,默认返回none def show(self): print('c2') c2_obj = c2('c2',11)c1_obj = c1('c1',c2_obj)print(c1_obj.name,c1_obj.obj.name)
3.多层封装
class c1: def __init__(self,name,obj): self.name = name self.obj = obj#把对象c2_obj封装到c1_obj对象中,并赋值给c1类中的obj属性class c2: def __init__(self,name,age): self.name = name self.age = age#方法里面没有返回值,默认返回none def show(self): print('c2')class c3: def __init__(self,name,age): self.name = name self.age = agec2_obj = c2('c2',11)c1_obj = c1('c1',c2_obj)c3_obj = c3('c3',c1_obj)c3_obj.age.obj.show()
六、继承与多继承
1.继承
子类可以继承父类的内容。
#子类继承父类的所有功能,相当于在子类中又复制了一份方法 #子类 ==> 父类 派生类 ==> 基类
class F1: def show(self): print('F1') def foo(self): print(self.name)class F2(F1): def __init__(self): self.name = 1234 def showtime(self): print('F2')obj = F2()obj.show() #打印结果 F1obj.foo() #打印结果 1234
#如果子类和父类中有相同的方法,优先调用子类自己的方法。
class S1: def F1(self): self.F2() def F2(self): print('S1.F2')class S2(S1): def F3(self): self.F1() def F2(self): print('S2.F2')obj = S2()obj.F3()
多继承
#多继承,查找方法 #查找方法的顺序根据传入参数的顺序
class A: def A(self): print('再找我')class B(A): def B(self): print('先找我')class C: def __init__(self): print('我是在创建对象时默认执行的') def C(self): print('都不行,再找我')class D(B,C): def D(self): self.A()obj = D()obj.A()
#当多个子类拥有相同的父类时,方法是如何去查找和使用的
#当多个子类拥有相同的父类时,
class A0: def A0(self): print('A0')class A1(A0): def A1(self): print('A1')class A2(A0): def A2(self): print('A2')class A3(A1): def A3(self): print('A3')class A4(A2): def A4(self): print('A2')class A5(A3,A4): def A5(self): print('A5')obj = A5()obj.A0()
#
class A: def some(self): print('打印我')class D: def forever(self): self.run()class C(D): def __init__(self): print('init2') def run(self): self.some()class B(C): def __init__(self): print('init') def some(self): print('打印我?')class E(A,B): def __init__(self): passobj = E()obj.forever()