简介:
在使用了类对象的的时候,我们可以直接调用构造方法为对象赋值,也可以采用对象.属性的方式赋值,这
都是为什么呢?
当然都是调用了魔术方法,也就是解释器自己调用的,当我们在做某些操作的时候,会自动调用
查看对象的属性
使用:__dict__()
返回值:返回字典
__doc__ 返回说明文档
说明文档就是用三引号放在最前面创建
__name__ 返回当前文件名
__module__ 返回当前所在文件的名称
__bases__ 返回当前类的直属父类
init()构造方法
作用:初始化对象
class A:
def __init__(self,name):
self.name=name
注意:可以自己随意为类对象添加属性,第一个self代表当前类的实例,在创建对象的时候自己调用
new()构造方法
作用:创建对象
class A:
def __new__(self,age):
if age>20:
super().__new__(self)
else:
return None
可以控制对象的创建,正是有了这个方法,才可以创建对象
__getattr__(self,item) 当获取不存在的值时,会调用
__setattr__(self,key,value) 设值
__delattr__(self,item) 删除值
__getattribute__(self,item) 获取成员值
__call__() 把类对象作为函数使用
__del__() 析构函数,回收函数的时候
__len__() 长度
__str__() 输出对象信息
__repr__() 输出对象信息,不过碰到换行符之类的不转义
__bool__() 返回bool值
运算信息
__add__() +
__sub__() -
等等,其实调用的都是这些方法,可以重写
判断属性的方法
issubclass(子类,父类) 是否为子类
isinstance() 是否为类的对象
hasattr(obj,属性) 对象是否有这个属性
getattr(obj,属性,默认值) 取值,没有就报错,可以设默认值,没有就返回默认值
setattr(obj,属性,值) 设值
delattr(obj,属性) 删除值
dir(obj) 获取可以访问的所有成员列表
对上面的理解:我们在类外面调用的obj.属性,其实都是调用上面的方法,可以自己重写那些魔术方法
类中的方法分类
对象方法 含self的
类方法 使用classmethod的
静态方法 使用staticmethod的,与类无关
类绑定方法 只有类可以调用的
mixin编程
作用:和继承一样
分类:是一种开发模式,前人总结,后人使用的
方式:
一、继承
、、、
二、bases实现
class A():
pass
class B():
pass
class C(A):
pass
C.__bases__ +=B,
三、利用插件完成mixin
class A:
def __init__(self):
self.l=[]
def show(self,other):
for i in self.l:
other.__dict__[i.__name__]=i #i.__name__是函数名
class B(A):
def __init__(self):
super().__init__()
self.l.append(self.a)
def a(self):
print('asf')
class C:
pass
c=C()
B().show(c)
描述符
一、使用魔术方法
class A:
def __init__(self):
self.name='a'
def __get__(self,instance,owner):
return self.name
def __set__(self,value):
self.name=value
def __delete__(self):
del self.name
class B:
name=A()
pass
b=B()
接下来可以通过b.name进行操作了
二、使用property
class A:
def __init__(self):
self.name='a'
def getName(self):
return self.name
def setName(self,value):
self.name=value
def delName(self):
del self.name
name=property(getName,setName,delName,'说明')
a=A()
a.name
接下来可以通过a.name进行操作了
三、使用@property
class A:
def __init__(self):
self.name='a'
@property
def sex(self):
reutrn self.name
@sex.setter
def sex(self,name)
self.name=name
@sex.deleter
def sex(self):
del self.name
a=A()
接下来可以通过a.sex进行操作了