一、面向对象概念简介:
当编写复杂功能时,需要使用类。
1、类(class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。类是一个模型,一个种类,一个蓝图
2、数据成员:类变量或实例变量,用于处理类及其实例对象的相关的数据
3 、方法:类中定义的函数
4、实例:实例就是对象。
5、实例化:创建一个类的实例,类的具体对象。
6、类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。类变量不需要实例化就可以使用。self.xxx
7、局部变量:定义在方法中的变量,只作用于当前实例的类。
8、对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
9、实例变量:如果变量前面加了self的话,在这个类里面,其他的函数都可以使用这个变量。必须得实例化之后才可以用。
10、实例方法:函数带有self的,就是实例方法,实例方法必须实例化后才能使用
11、self:本类对象
12、类方法:
类方法 @classmethod def shuoming(cls): cls代表的就是当前这个类 pass 1、不需要实例化就可以调用的,直接类名.xxx, self.shuoming() 2、它调用不了实例方法和实例变量。
13、静态方法
只是写在类里面而已,它调用不了类方法、类变量、实例方法、实例变量,通过类名.XX使用
类方法、实例方法可以调用它
self.act()
cls.act()
14、属性方法:看起来像变量的方法
二、面向对象编程具体应用
1.示例一:
class Buy_car:#用class定义类,一般类用大写字母开头 def shop(self): print('4s') def baoxian(self): print('保险公司') def shuiwuju(self): print("税务局") def jiaoguansuo(self): print("交管所") #面向对象也是包含面向过程的 。面向对象:化零为整
xiaowang=Buy_car() #类名加括号就是实例化。类不能直接使用,需要实例化才能使用 #带了self的必须要实例化才能用、 # Buy_car.baoxian() #错误示范。类未实例化,直接用会报错。 xiaobai=Buy_car() xiaowang.shuiwuju() xiaobai.shuiwuju()
2.示例二:
#定义类:
class Person(): #self:代表本类的对象 country='China' #类变量:直接在类中定义的变量是类变量,类变量是公共的,谁都可以使用,使用时也是self.country #类变量不需要实例化也可以用 def __init__(self,name,leg=2) #构造函数,类在实例化的时候,会自动执行构造函数。如果有入参,在实例化的时候也必须传参 sex='unknow' #局部变量,只能作用于当前实例 self.name=name #如果在变量前加了self.那么在这个类的其他方法中都可以用 self.leg=leg print("self的内存地址",id(self) #id():查看内存地址,与实例化后的类的内存地址一样 def __del__(self): #析构方法:程序执行完,自动执行析构方法中代码。被销毁是指不在内存中,当代码执行完就不在内存中。所以就执行析构方法 print("什么时候执行析构方法") def fly(self): #类中的方法,互相调用时,用self.XXX print('fly') self.bird="猫头鹰" #实例变量:任意位置定义self.XXX,都可以用self.XXX调用 def eat(self): print('eat') print("eat:%s"%self.bird) #调用实例变量 def wc(self): print("%s去了%s次厕所"%(self.name,self.count)) #注意这里没有定义self.count,所以 如果要调用wc的话,就要先定义self.count def say(self): print('是我的名字是%s,我有%s条腿'%(self.name,self.leg)) print('国籍是%s'%self.country)
#实例化Person类,并调用
print(Person.country) # 类变量不需要实例化也可以用 hm=Person('hm',2) #实例化即会执行init函数。如果类中的构造函数定义了参数,实例化时也要传参。 Person.say(hm)#跟hm.say()其实是一样的 hm.say()#类中的self就是实例化对象本身,谁调就是谁,self 就是hm #在类中能点(.)出来的,在实例化后一样可以点出来 print('hm实例的内存地址',id(hm)) #实例后的内存地址,跟类中的self一样. hm.fly()#要先调用fly ,获取bird,后边的eat()才能用 hm.eat()# hm.count=50#先给count定义,后边用过count的方法才能执行 hm.wc()
#删除实例:del XX
del hm #删掉hm实例,删掉后,相当于实例不存在了,实例中的变量和方法也不能用 #如果类实例化后,用del删掉了该实例,需要重新对这个类实例化。
析构函数是在程序结束后调用的,或者当对对象的所有引用都被删除时调用的
3.list、dict等都是类,
我们调用的list.append(),其实就是调用的list的实例
a=[1,2,3,4] a=list([1,2,3,4]) #同上 a.append('4,5,6')
三、类方法:类自带的方法,即类方法
class Car: def run(self): #实例方法中,调用本类变量、类方法都要用self.XXX调用 print("run") hm=Person('hanmin') #实例方法中,调用其他类的实例方法 print(self.country) #这个country是本类中的country print(hm.country) #这个country是Person这个类中的country self.shuoming() #类方法是公共的,实例方法中也可以调用类方法 #run=self #self代表本身的类,可以XXX=self,就是实例化这个类 #run.shuoming()#类方法是公共的,实例方法中也可以调用类方法 #在类中,函数的调用不是按顺序执行的,可以直接调用后边代码中的变量或方法
@classmethod
#加了装饰器的方法就是类方法。类方法也是公共的。类中的方法都可以调用。但是不能直接调用实例方法和实例变量. #类方法在调用时,不需要实例化,直接 类名.方法名()即可调用 def shuoming(cls) #cls代表此类本身,与实例方法中的self类似 #类方法中只能直接调用类变量、类方法 print("怎么造汽车") print("造%s的汽车"%cls.country) bmw=cls #cls代表本身的类,其实相当于把这个类实例化 bmw.run() #实例方法实例化后,可以调用实例方法
四、静态方法
@staticmethod #写在类中的普通方法,不需要实例化,不能调用类方法,也不能调用实例方法。但是类方法、实例方法都能调用静态方法 def act(): print('静态方法') Car.act() #调用时直接用类名.方法名
五、属性方法:
看起来像变量的一个方法。不能有传参,不能有入参
@property def name(self): return '大黄蜂' print(c.name) #属性方法,调用时直接调用函数名,不能加括号
六、面向对象编程例子:
import pymysql class MySQL: def __init__(self ): self.conn=pymysql.connect(host='117.25.23.20,user='XXX',password='45461 ', db='jxz',port=3306,charset='utf8', autocommit=True) self.cur=self.conn.cursor(pymysql.cursors.DictCursor) def __del__(self): #析构方法: print('什么时候执行析构方法') def excute_one(self,sql): self.cur.execute(sql) return self.cur.fetchone() def execut_many(self,sql): self.cur.execute(sql) return self.cur.fetchall() def close(self): self.cur.close() self.conn.close() def __del__(self): #当实例被执行完后,执行此代码 self.cur.close() self.conn.close() print('连接已被关闭')
m=MySQL() print(m.excute_one('select * from app_myuser'))