Python学习笔记(27)面向对象-类
一、类
类的概念:类是指面向对象的编程,面向对象包含面对过程,类的思想就是化零为整的操作,把某些操作封装在一个类中后,可以通过类名.属性,类名.方法来调用
举例:买车
买车:
1、4s看车,买车 a
2、上保险,保险公司 b
3、交税 地税局 c
4、交管所 上牌 d
面向过程:以前买车需要到 a,b,c,d四个地方操作完后才能完成买车所有的东西
卖车处:
1、4s
2、保险
3、交税
4、上牌
面向对象:现在将所有的买车操作手续封装到卖车处,只需要在4S店就可以完成所有的操作即可
类:类是一个模型,包含了属性和方法,如下以Person类为例
1 import time 2 class Person(object): #新式类 3 # class Person:#经典类 4 country = 'China' #类变量,通过实例或者类名都可以调用 5 def __init__(self,name,sex,color):#构造方法,也就是初始化方法,在创建时调用 6 self.name = name #实例变量,在类中和实例中都可以调用 7 self.sex = sex 8 self.color = color 9 '''__开头变量就是私有变量,只有在类中才能使用,出类的范围后失效,且私有变量无法被继承''' 10 self.__money = 10000 11 print('self的内存地址',id(self)) 12 13 '''__开头方法名就是私有方法,只能在类中使用,出了类后失效,且私有方法无法被继承''' 14 def __secret(self): 15 print('每个人都有自己的秘密') 16 17 @classmethod 18 def xuexi(cls): 19 '''类方法,可通过类名和实例来调用,类方法中不能调用实例变量或者实例方法,但是可调用其他类方法''' 20 print("爱学习") 21 return True 22 23 @classmethod 24 def makemoney(cls): 25 print('要挣钱要爱学习',cls.xuexi()) 26 27 def __del__(self): 28 '''析构函数,在实例销毁时自动执行''' 29 print('这是析构函数,实例销毁时自动执行') 30 31 @staticmethod 32 def help(): 33 '''静态方法一般只用来介绍类的说明,与类和方法没有多大关联性,可通过实例.方法名,类名.方法名调用''' 34 print('这是人类的使用说明') 35 36 def cry(self):#带self的都是实例方法 37 print('%s cry....'%self.name) 38 39 def fly(self): 40 print('%s fly....'%self.name) 41 '''调用私有变量__money''' 42 print('需要%s元才能飞'%self.__money) 43 '''调用私有方法__secret''' 44 self.__secret() 45 def eat(self): 46 print('color',self.color) 47 print('eat..') 48 49 '''属性方法:使用装饰器property的方法,一般用来计算或处理数据,可当做变量来调用,通过实例.方法名调用即可''' 50 @property 51 def work_age(self): 52 self.help() 53 create_time = 1528860238 54 result = (time.time() - create_time) / (365*24*60*60) 55 return round(result,1) 56 57 ccx = Person('Tang','女','黑色')#实例化后调用init初始化方法 58 print('实例的内存地址',id(ccx)) 59 ccx.eat() #eat(ccx) 60 print(ccx.work_age)#调用属性方法 61 #类变量 62 print(ccx.country) 63 print(Person.country) 64 #类方法 65 ccx.xuexi() 66 Person.xuexi() 67 Person.makemoney() 68 #静态方法 69 ccx.help() 70 Person.help() 71 72 ccx.fly()
类 一个模型、一个例子 实例/对象 实例,通过模型造出来具体东西 实例化 把模型变成实例的过程 继承
封装 构造函数 类在实例化的时候,自动执行的函数 __init__ self 本类对象 self就是你实例化的那个变量 self.xxx = xxx 在别的函数里面就直接可以用了 析构函数 实例被销毁的时候自动执行的函数 __del__ 类方法
可通过实例或者类名来调用,使用@classmethod修饰,不能调用实例变量,不能调用实例方法,但是能调用类方法 类变量
可通过实例或者类名来调用 属性方法
使用@property修饰,如def price(self),不可再传参数,可使用实例.函数名来调用 如 xh.price
当某个功能有N个函数来实现,函数名比较多,使用if...else比较繁琐,可使用hasattr(类名,方法名)判断该类中是否含有这种方法名,getattr(类名,方法名)来获取对应的方法名,如,getattr(MyRequests,method)()来执行如get() post()等方法 私有 -》不是公共的,只能在类里面的函数调用,在类外面不可以调用 函数/变量以__开头,就是私有的,私有变量和私有方法不能被继承,只能在类中调用,出类后失效 实例方法
方法中带有self入参的方法,就是实例方法,需要实例化后才能使用 实例变量
通过self.xxx调用 一般在init构造函数中定义实例变量
关于数据库操作的一个例子:
class MysqlDB: def __init__(self,mysql_info): self.mysql_info = mysql_info self.__connect() def __del__(self): self.__close() def __connect(self): self.conn = pymysql.connect(**self.mysql_info) self.cursor = self.conn.cursor(pymysql.cursors.DictCursor) def execute(self,sql): self.cursor.execute(sql) def fetchone(self): #select * from user where username = 'xx'; return self.cursor.fetchone() def fetchall(self):#select * from user; return self.cursor.fetchall() def fetchmany(self,limit): return self.cursor.fetchmany(limit) def __close(self): self.cursor.close() self.conn.close() mysql_info = {'host':'127.0.0.1','user':'jxz','password':'123456', 'port':3306,'autocommit':True,'charset':'utf8','db':'jxz'} m = MysqlDB(mysql_info) m.execute('select * from app_myuser where username = "liangcailian";') result = m.fetchone()