day33
目录
classmethod
classmethod是一个装饰器,可以装饰给类内部的方法,使该方法绑定给类来使用
-对象的绑定方法特殊之处
由对象来调用,会将对象当做第一个参数传给该方法。
-类的绑定方法特殊之处
由类来调用,会将类当做第一个参数传给该方法
staticmethod
staticmethod是一个装饰器,可以装饰给类内部的方法,使该方法即不绑定给对象,也不绑定给类
面向对象高级
__class__
对象的属性,获取该对象当前的类
isinstance(参数1,参数2):
python内置的函数,可以传入两个参数,用于判断参数1是否是参数2的一个实例
即 判断一个对象是否是一个类的实例。
issubclass(参数1,参数2):
用与判断参数1是否是参数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
反射
指的是通过"字符串",对 对象或类的属性进行操作
class People:
country = 'China'
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
hasattr:
通过字符串,判断该字符串是否是对象或类的属性。
# 普通方式
p = People('tank', 17, 'male')
print('name' in p.__dict__) # True
print('country' in People.__dict__) # True
print('country2' in People.__dict__) # False
# hasattr
print(hasattr(p, 'name')) # True
print(hasattr(People, 'country')) # True
getattr:
通过字符串,获取对象或类的属性。
# 普通方式
p = People('tank', 17, 'male')
print(p.__dict__.get('name')) # tank
print(p.__dict__.get('level', '9')) # 9
# getattr
print(getattr(p, 'name', 'jason_sb')) # tank
print(getattr(p, 'name1', 'jason_sb')) # jason_sb
print(getattr(People, 'country2', 'China'))
setattr:
通过字符串,设置对象或类的属性。
# 普通
p.level = 10
print(p.level) # 10
# 反射
setattr(p, 'sal', '3.0')
print(hasattr(p, 'sal')) # True
delattr:
通过字符串,删除对象或类的属性。
# 普通
del p.level
print(hasattr(p, 'level')) # False
# 反射
delattr(p, 'sal')
print(hasattr(p, 'sal')) # False
魔法方法
凡是在类内部定义,以__开头__结尾
的方法都称之为魔法方法,又称为“类的内置方法”
魔法方法会在某些条件成立时触发。
__init__
在调用类时触发
__str__
会在打印对象时触发
__del__
对象被销毁前执行该方法,该方法会在最后执行
__getattr__
会在 对象 . 属性 时,“属性没有”的情况下触发
__setattr__
会在“对象.属性 = 属性值”时触发
__call__
会在对象被调用时触发
__new__
会在__init__
执行前触发
案例
class Foo(object):
def __new__(cls, *args, **kwargs):
print(cls)
return object.__new__(cls) # 真正产生一个空对象
# 若当前类的__new__没有return一个空对象时,则不会触发。
def __init__(self):
print('在调用类时触发...')
# def __str__(self):
# print('会在打印对象时触发...')
# # 必须要有一个返回值, 该返回值必须时字符串类型
# return '[1, 2, 3]'
def __del__(self):
print('对象被销毁前执行该方法...')
def __getattr__(self, item):
print('会在对象.属性时,“属性没有”的情况下才会触发...')
print(item)
# 默认返回None, 若想打印属性的结果,必须return一个值
return 111
# 注意: 执行该方法时,外部“对象.属性=属性值”时无效。
def __setattr__(self, key, value):
print('会在 “对象.属性 = 属性值” 时触发...')
print(key, value)
print(type(self))
print(self, 111)
self.__dict__[key] = value
def __call__(self, *args, **kwargs):
print(self)
print('调用对象时触发该方法...')
foo_obj = Foo()
print(foo_obj)
print(foo_obj.x)
print(foo_obj.x)
foo_obj.x = 123
print(foo_obj.x)
foo_obj()
list1 = [1, 2, 3] # list1 = list([1, 2, 3])
print(list1) # [1, 2, 3]
单例模式
单例模式指的是单个实例,实例指的的是调用类产生的对象
实例化多个对象会产生不同的内存地址,单例可以让所有调用者
在调用类产生对象的情况下都指向同一份内存地址。
单例的目的
为了减少内存的占用