绑定方法:
装饰器 -相对于函数而言
@classmethod
-:装饰给类内部的方法,给类使用将类当作第一个参数传给方法
--self -->cls
对象,和类都能调用。只是自动传入的参数不同。
-:对象调用,会将对象当作第一个参数传给方法
@staticmethod
-:非绑定方法,不绑定类和对象--》普通函数
高级方法:
--python内置函数
isinstance
(参数1,参数2)
-判断一个对象是否是一个类的实列(对象)
-判断参数1是否参数的对象
issubclass
(参数1,参数2)
判断参数1是否参数2的子类
反射:
-指的是通过“字符串”对 对象或类的属性进行操作。
hasattr
: 通过字符串,判断该字符串是否是对象或类的属性。
getattr
: 通过字符串,获取对象或类的属性。
setatt
r: 通过字符串,设置对象或类的属性
delattr
: 通过字符串,删除对象或类的属性
class People:
country = 'China'
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
p = People('tank',34,'male')
print(hasattr(p,'name'))
print(getattr(p,'age'))
setattr(p,'sal','3.0')
delattr(p,'level')
hasattr(obj,'属性(字符串)')--True,False
getattr(obj,'属性',defult(默认值)) --True.None / defult
setattr(obj,'属性',‘属性的值’)
delattr(obj,'属性')
class CMD:
def __init__(self):
pass
def input_cmd(self):
print('请输入命令!')
while True:
cmd = input('输入命令方法名:')
if hasattr(self,cmd):
method = getattr(self,cmd)
method()
else:
print('error!!')
def upload(self):
print('电影开始上传....')
def download(self):
print('电影开始下载....')
cmd_obj = CMD()
cmd_obj.input_cmd()
注意:getattr,hasattr,setattr,delattr
对模块的修改都在内存中进行,并不会影响文件中真实内容
魔法方法:
-python内置方法,会在某些条件成立是自动触发
--再类内部定义,______开头_______结尾
# 内置方法(object)
__init__ : 会在对象调用类自动触发
__str__ : 会再打印对象时触发,必须要有返回值---》字符串类型
__del__ : 会在程序最后结束时触发,将对象销毁
__call__ : 对象被调用时触发,对象后面加括号时,触发执行。
注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
__new__ : 会在__init__执行前触发,生成一个空对象 [普通函数]
__doc__ : 返回类的注释信息 ,print(类名.__doc__)
__setattr__ : 对象调用属性时,添加/修改属性会触发它的执行
__delattr__ : 删除属性的时候会触发
__getattr__ : 对象调用属性时,没有该属性时触发,没有默认值就返回None
__getattribute__ : 查找属性无论是否存在,都会执行
--当__getattribute__与__getattr__同时存在,只会执行__getattrbute__,除非__getattribute__在执行过程中抛出异常AttributeError
__new__方法是传入类(cls),而__init__方法传入类的实例化对象(self),__new__方法返回的值就是一个实例化对象(ps:如果__new__方法返回None,则__init__方法不会被执行,并且返回值只能调用父类中的__new__方法,而不能调用毫无关系的类的__new__方法
class A:
pass
class B(A):
def __new__(cls):
print('__new__方法被执行')
return super().__new__(cls)
def __init__(self):
print('__init__方法被执行')
b = B()
__new__方法被执行 #创建类
__init__方法被执行 #创建对象
小结:__new__和__init__相配合才是python中真正的类构造器。
单列模式:
-单个实例 : 即调用类产生的对象
--实例化多个对象会产生不同的内存地址,
--基于某种方法实例化多次得到实例是同一个
优点:当实例化多次得到的对象中存放的属性都一样的情况,应该将多个对象指向同一个内存,即同一个实例
#方法一:
--利用类的绑定方法的特性
NAME = 'nick'
AGE = 18
class People():
__instance = None
def __init__(self,name,age):
self.name = name
self.age = age
@classmethod
def from_conf(cls):
if cls.__instance:
return cls.__instance
cls.__instance = cls(NAME,AGE)
return cls.__instance
obj1 = People.from_conf()
obj2 = People.from_conf()
print(obj1)
print(obj2)
print(obj1.__dict__)
print(obj2.__dict__)
#方法二:
--装饰器
NAME = 'nick'
AGE = 18
def deco(cls):
cls.__instance = cls(NAME,AGE)
def wrapper(*args,**kwargs):
if len(args) == 0 and len(kwargs) == 0:
return cls.__instance
res = cls(*args,**kwargs)
return res
@deco
class People():
def __init__(self,name,age):
self.name = name
self.age = age
p1 = People()
p2 = People()