1. 基本知识:
# (1) 类的定义: 使用class关键字定义,类名最好采用大驼峰体 class MyCar1: #可以不加括号 pass class MyCar2(): # 此种方法推荐 pass class MyCar3(object): pass # (2) 类的实例化: obj = MyCar2() # (3) 类的基本结构: 类中值包含两种成员,一种是成员属性(相当于变量),一种是成员方法(相当于函数) class MyHouse(): size = "big" def func1(self): print("It's a dream")
2. 定义一个类: 类里面包含公有属性和方法,私有属性和方法
class Travel(): didian = "海南" # 公有属性 __jiudian = "海韵" # 私有属性 def luxian(self): # 公有方法,形参self,也叫绑定方法(绑定到对象) print("先去南海观音,再去天涯海角") def __shijian(self): # 私有方法 print("明天启程")
3. 对象的相关操作:
3.1 实例化对象访问公有成员的属性和方法,若是调用私有的属性或方法,程序会报错
obj = Travel() print(obj.didian) # 海南 obj.luxian() # 先去南海观音,再去天涯海角 # (2) 实例化对象动态的添加公有成员属性和方法 obj.didian = "西藏" print(obj.didian) # 西藏 # 通过__dict__可以查看对象或者类里面的成员,返回一个字典 print(obj.__dict__) # {'didian': '西藏'}
3.2 通过对象添加成员方法, 一共有三种方法
# 方法一: 动态添加无参方法 def nanhai(): print("南海观音真雄伟,让人惊叹!") # 通过对象.属性(自定义的) = 方法 添加 obj.nanhai = nanhai obj.nanhai() # 南海观音真雄伟,让人惊叹! # 方法二: 动态添加有参方法 # 形式一: def menpiao(price): print("进门票价{}元".format(price)) obj.menpiao = menpiao obj.menpiao(160) # 进门票价160元 # 形式二: def menpiao(obj,price): print("进门票价{}元,地点是{}".format(price,obj.didian)) obj.menpiao = menpiao obj.menpiao(obj,160) # 进门票价160元,地点是西藏 # 形式三: 通过types.MethodType来创建一个方法,自动传递obj对象 import types #(推荐) def menpiao(self,price): print("进门票价{}元,地点是{}".format(price,self.didian)) obj.menpiao = types.MethodType(menpiao,obj) # 调用此方法时,自动把对象当做参数传递给该方法 obj.menpiao(180) # 进门票价180元,地点是西藏 # 方法三: 动态添加lambda匿名函数 obj.money = lambda : print("一共准备5万") obj.money() # 一共准备5万
4. 类的相关操作: 访问公有的属性和方法,动态的添加方法
class Travel(): didian = "海南" # 公有属性 __jiudian = "海韵" # 私有属性 def luxian(): # 公有无参方法 print("先去南海观音,再去天涯海角") def __shijian(): # 私有无参方法 print("明天启程") # (1)定义的类访问共有成员和方法,若访问私有的会报错 print(Travel.didian) # 海南 Travel.luxian() # 先去南海观音,再去天涯海角 # (2) 定义的类动态的添加公有的属性和方法 # 方法一: 动态的添加无参方法 def shan(): print("去桂林看山") Travel.shan = shan Travel.shan() # 去桂林看山 # 方法二: 动态的添加有参方法 def shui(name): print("去看看{}".format(name)) Travel.shui = shui Travel.shui("西湖") # 去看看西湖 # 方法三: 动态的添加lambda匿名函数 Travel.cao = lambda : print("去西藏看大草原") Travel.cao() # 去西藏看大草原 Travel.visit = lambda name : print("一起看世界,和{}".format(name)) Travel.visit("喜欢的人") # 一起看世界,和喜欢的人
* 类与对象的区别: 类里面的成员只归属于类本身, 对象可以调用类里面公有的属性和方法,但是不能修改, 对象在调用成员时,先查找自己本身有没有这个成员,没有的话再从类里面找, 如果类里面也没有,程序报错. 类无法调用对象里面的成员.
5. 查看私有成员: 两种方法
class Travel(): didian = "海南" # 公有属性 __jiudian = "海韵" # 私有属性 def luxian(): # 公有无参方法 print("先去南海观音,再去天涯海角") def __tongxing(): # 私有无参方法 print("不能透露") def shijian(self): # 公有有参方法 print("明天启程") def __fanghao(self): print("我会告诉你是888号吗?") obj = Travel() # 方法一: 根据python存私有变量的规律[_类名__成员名](不推荐) print(obj._Travel__jiudian) # 海韵 obj._Travel__fanghao() # 我会告诉你是888号吗? print(Travel._Travel__jiudian) Travel._Travel__tongxing() # 不能透露
# 方式二: 通过类内的共有方法间接调用私有成员(推荐) class Travel(): didian = "海南" # 公有属性 __jiudian = "海韵" # 私有属性 def luxian(): # 公有无参方法 print("先去南海观音,再去天涯海角") def __tongxing(): # 私有无参方法 print("不能透露") def shijian(self): # 公有有参方法 print("明天启程") def __fanghao(self): print("我会告诉你是888号吗?") def fangfa(self): print(self.__jiudian) self.__fanghao() def fangfa2(): print(Travel.__jiudian) Travel.__tongxing() obj = Travel() obj.fangfa() # 海韵 我会告诉你是888号吗? Travel.fangfa2() # 海韵 不能透露
6. 删除相关成员: 实例化的对象删除公有的属性和方法, 定义的类删除公有的成员和方法
class Travel(): didian = "海南" # 公有属性 __jiudian = "海韵" # 私有属性 def luxian(): # 公有无参方法 print("先去南海观音,再去天涯海角") def __tongxing(): # 私有无参方法 print("不能透露") def shijian(self): # 公有有参方法 print("明天启程") def __fanghao(self): print("我会告诉你是888号吗?") def fangfa(self): print(self.__jiudian) self.__fanghao() def fangfa2(): print(Travel.__jiudian) Travel.__tongxing() obj = Travel() # 实例化的对象删除公有的属性和方法 obj.didian = "上海" print(obj.didian) # 上海 del obj.didian print(obj.didian) # 海南 obj.zou = lambda : print("说走就走") obj.zou() # 说走就走 del obj.zou # obj.zou() # 报错,因为方法已删除 # 定义的类删除公有的成员和方法 del Travel.didian # print(Travel.didian) # 报错 del Travel.luxian # Travel.luxian() # 报错 del Travel.__fanghao # 报错
7. __init__构造方法: 在实例化对象,初始化的时候触发,功能是可以为对象添加成员,参数至少有一个self,无返回值
class Travel(): def __init__(self,didian): self.didian = didian # 实例化 obj = Travel("海南") print(obj.didian) # 海南 # 可以通过一个类实例化不同的对象 class Travel(): def __init__(self,didian,time): self.didian = didian self.time = time def shan(self): print("山:{}去{}玩".format(self.time,self.didian)) def shui(self): print("水:{}去{}玩".format(self.time, self.didian)) def hai(self): print("海:{}去{}玩".format(self.time,self.didian)) # 第一个对象: wudangshan = Travel("湖北","5月") wudangshan.shan() # 山:5月去湖北玩 # 第二个对象: xihu = Travel("杭州","6月") xihu.shui() # 水:6月去杭州玩 # 第三个对象 dadonghai = Travel("三亚","7月") dadonghai.hai() # 海:7月去三亚玩