类的魔术方法、mixin编程、描述符

简介:
在使用了类对象的的时候,我们可以直接调用构造方法为对象赋值,也可以采用对象.属性的方式赋值,这
都是为什么呢?
当然都是调用了魔术方法,也就是解释器自己调用的,当我们在做某些操作的时候,会自动调用

查看对象的属性

使用:__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进行操作了   	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值