面向对象(绑定方法、非绑定方法、隐藏属性、property装饰器)
绑定方法
1.绑定给对象的方法
就是在生成对象的时候,可以通过对象直接使用除了__init__的方法
只需要在定义阶段给方法(函数)里面传一个self,self也就是对象自己
如果需要直接类来调用,则还需要传入 "对象名"
class Games: is_type = 'hero' def __init__(self, name, hp): self.name = name self.hp = hp def check_hp(self): # 这个self相当于在调用阶段的Games.check_hp(hero1) print(f'{self.name}的血量为{self.hp}') hero1 = Games('瑶瑶公主', 2587) hero1.check_hp() # 直接调用 # 瑶瑶公主的血量为2587
2.绑定给类的方法
当产生一个对象之后,可以直接调用类.方法()来使用,而不再通过 对象.方法来调用
如果方法有需要传参数,那么只能通过类来调用,不再能通过对象
class Games: is_type = 'hero' def __init__(self, name, hp): self.name = name self.hp = hp with open(r'a.txt', 'w', encoding='utf8') as f: f.write(name+'|'+hp) @classmethod def check_hp(cls): # 这个cls就是类本身 with open(r'a.txt', 'r', encoding='utf8') as f: res = f.read().split('|') return res hero1 = Games('111', '2587') print(Games.check_hp()[0], Games.check_hp()[1]) # 直接调用
非绑定方法
就是既不绑定给类,也不绑定给对象的方法,就是我的可以使用类的方法调用,也可以产生的对象中使用
小tips:当方法里即用到了类,也用到了对象,这个方法绑定对象更合适
class Games: is_type = 'hero' def __init__(self, name, hp): self.name = name self.hp = hp self.new = self.check_hp(5) @staticmethod # 只需要添加一个语法糖 def check_hp(n): return n hero1 = Games('111', '2587') print(hero1.new) print(Games.check_hp(5))
隐藏属性
1.隐藏属性在类的定义阶段,发生了变形,__类名__属性名
2.不但可以隐藏类属性、方法、对象的属性都可以隐藏的,而对类的内部是开放的
3.隐藏属性对外不对内,对内的外部都是隐藏的,而对类的内部是开放的
使用情况:
当我们不想让外部直接修改或者查看类中的属性时,可以通过隐藏属性+方法来对传入的修改值进行"操作"
class Games: __is_type = 'hero' # is_type已经被隐藏在外部找不到 def __init__(self, name, hp): # 形参 self.name = name # 前面的name是所产生字典中的key值 self.hp = hp def xiugai(self, new_type): self.__is_type = new_type def check_type(self): return self.__is_type hero1 = Games('瑶瑶公主', 2587) hero2 = Games('飞飞公主', 3440) hero1.xiugai('辅助') print(hero1.check_type())
property装饰器
就是将方法伪装成属性来使用
方法一(装饰器):
class Games: __is_type = 'hero' # is_type已经被隐藏在外部找不到 def __init__(self, name, hp): self.name = name self.hp = hp @property # 将property绑定给is_type def is_type(self): return self.__is_type @is_type.setter # 用于修改,只要有等于就会自动找到 def is_type(self, new_type): Games.__is_type = new_type @is_type.deleter # 同理,用于删除 def is_type(self): del Games.__is_type hero2 = Games('飞飞公主', 3440) print(hero2.is_type) # hero hero2.is_type = '辅助' print(hero2.is_type) # 辅助 del hero2.is_type print(hero2.is_type) # 报错
方法二(表达式):
class Games: __is_type = 'hero' # is_type已经被隐藏在外部找不到 def __init__(self, name, hp): self.name = name self.hp = hp def get_type(self): return self.__is_type def set_type(self, new_type): Games.__is_type = new_type def del_type(self): del Games.__is_type is_type = property(get_type, set_type, del_type) # 顺序只能查看、修改、和删除,顺序不可以变 hero2 = Games('飞飞公主', 3440) print(hero2.is_type) # hero hero2.is_type = '辅助' print(hero2.is_type) # 辅助 del hero2.is_type print(hero2.is_type) # 报错