面向对象 进阶
classmethod:类方法
classmethod是一个装饰器,可以装饰给类内部的方法,使该方法绑定给类来使用
对象的绑定方法特点
由对象调用,会将对象当作第一个参数传给该方法
类的绑定方法的特点
由类来调用,会将类当作第一个参数传给该方法
class People:
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod # 此处加上装饰器
def tell_info(cls):
print(cls)
print('此处是类方法')
p = People('tank',18)
p.tell_info() # 加了装饰器不影响对象调用
People.tell_info() # 让类(省去参数)调用
staticmethod:非绑定方法
staticmethod是一个装饰器,可以装饰给类内部的方法,使该方法即不绑定给对象,也不绑定给类。
user = 'allen'
pwd = '111'
import settings
import hashlib
import uuid
class Teacher:
def __init__(self, user, pwd):
self.user = user
self.pwd = pwd
def index(self):
if self.user == 'allen' and self.pwd == '111':
print('验证通过,显示主页...')
@classmethod
def login_auth_from_settings(cls):
obj = cls(settings.user, settings.pwd)
return obj
@staticmethod
def create_id():
uuid_obj = uuid.uuid4()
md5 = hashlib.md5()
md5.update(str(uuid_obj).encode('utf8'))
return md5.hexdigest()
print(Teacher.create_id())
t1 = Teacher('allen', '111')
print(t1.create_id())
UUID 加密模块
通过时间戳生成唯一的随机随机字符串
isinstance:
python内置的函数,可以传入两个参数,用于判断参数1是否是参数2的一个实例
应用:判断一个对象是否是一个类的实例
issubclass:
python内置的函数,可以传入两个参数,用于判断参数一是否是参数2的一个子类
应用:判断一个类是否是另一个类的子类
class Foo:
pass
class Goo(Foo):
pass
foo_obj = Foo()
print(isinstance(foo_obj, Foo)) # True
print(isinstance(foo_obj, Goo)) # False
print(issubclass(Goo, Foo)) # True
反射:
指的是通过“字符串”对 类或对象 的属性进行操作
- hasattr:通过字符串判断该属性是否是类或对象的属性
- getattr:通过字符串,获取对象或者类的属性
- setattr:通过字符串,设置对象或者类的属性
- delattr:通过字符串,删除对象或者类的属性
class People:
country = 'China'
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex =sex
p = People('allen', 22, 'male')
print('name' in p.__dict__) # True 这是用普通方法判断
print(hasattr(p, 'name')) # True 这是用hasattr方法判断
print(p.__dict__.get('name')) # allen 这是用普通方法获取
print(getattr(p, 'name', 'jason')) # allen 这是用getattr方法获取,取到
print(getattr(p, 'name2', 'jason')) # jason 这是用getattr方法获取,没取到,用jason
p.level = 10 # 这是用普通方法添加属性
print(p.level) # 10
setattr(p, 'salary', '20') # 这是用setattr方法添加属性
print(p.salary) # 20
del p.level # 普通方法删除
print(hasattr(p, 'level')) # False
delattr(p, 'salary') # 这是用delattr方法删除
print(hasattr(p, 'salary')) # False
魔法方法:
凡是在类内部定义,以“__ 开头 __结尾”的方法都称为魔法方法,又称为“类的内置方法”
魔法方法会在对应的特定条件成立时触发
__ init __:在调用类时触发
__ str __: 在打印对象时触发,必须要有一个返回值,类型必须是字符串
__ del __: 在程序执行结束时触发,销毁对象。该方法在最后执行。
__ getattr __ 在“对象调用属性时,属性没有”的情况下触发。默认返回none,若想打印属性的结果,必须return一个值
__ setattr __ 在“对象.属性 = 属性值”时触发。只触发,不修改(添加)类的属性。
__ call __ 在对象被调用时被触发
__ new __ 在__init__执行前触发
单例模式
单例模式是指单个实例,实例指的是调用类产生的对象
实例化多个对象会产生不同的内存地址,单例可以让所有调用者,在调用类产生同一个对象时,都指向同一个对象的地址。例如:打开文件
目的:减少内存占用。
方式一:classmethod
__instance = None # 定义一个变量接收一个对象
@classmethod
def singleton(cls, file_name):
if not cls.__instance: # 判断是否已经存在一个对象
obj = cls(file_name) # 不存在就实例化一个
cls.__instance = obj # 传给__instance
return cls.__instance # 返回一个对象
方式二:
__instance = None
def __new__(cls, *args, **kwargs):
# cls.__new__(cls, *args, **kwargs)
if not cls.__instance:
cls.__instance = object.__new__(cls)
return cls.__instance