python面向对象的特殊方法和单例模式
主要内容:
1.特殊方法
2.设计模式:单例模式
1.特殊方法
isinstance 判断obj1是否是B这个类实例化来的,或者是B这个类的父类实例化来的.是的话,返回true,不是返回False
isinstance(obj1,B)
issubclass 判断一个类是否是另一个类的派生类.
print(issubclass(B,A)) 如果B类是A类派生来的话,那么就是Ture.
__len__, __hash__ __str__ __repr__
len(a1 )如果对一个对象进行len()操作, 他会找到对象从属于的类中的__len__方法,并且此方法中必须要有数字的返回值.
__hash__方法也有类似的效果.
示例:
class A: def __init__(self,name,age): self.name = name self.age = age def __len__(self): return len(self.__dict__) a1 = A('oldboy',1000) print(len(a1))
__str__方法
# print(a) # 打印对象,就会触发类中__str__方法
# str(a) # str(a),就会触发类中__str__方法
# print('打印此类对象:%s' % a) # 格式化输出 '%s'a
class A: def __init__(self,*args): self.name = args[0] self.age = args[1] def __str__(self): return "666" a1 = A("leon",18) print(str(a1)) print("%s----->"%a1)
repr也是类似的方法
__call__ 方法
对象() 自动执行类中的__call__方法
示例:
class A: def __init__(self): pass def func(self): print(111) def __call__(self, *args, **kwargs): '''各种代码''' # print(666) print(args) return 'wusir' a1 = A() print(a1(1,2,3))
class A: def __init__(self,*args): self.name = args[0] self.age = args[1] self.sex =args[2] def __call__(self, *args, **kwargs): print(666) a1 = A("leon",18,"男") a1()
__eq__方法
对一个类实例化的两个对象进行比较运算的时候,他会自动触发类中的__eq__
class A: def __init__(self): self.a = 1 self.b = 2 def __eq__(self,obj): if self.a == obj.a and self.b == obj.b: return True a1 = A() b1 = A() print(a1 == b1)
__del__ 析构方法
python垃圾回收机制
文件中你创建的所有的变量,类等等.执行完毕之后,
一段时间内如果没有用到, 他会自动在内存中去除.
深入研究: 他会将你的所有变量,类等等做个标记,在一段时间之内,没有被调用,则就会自动回收.
class A: def __init__(self): pass def __del__(self): print(666) a1 = A()
class A: def __del__(self): print(666) a1 = A()
__new__ object产生并返回一个对象空间.
当初始化对象时,比如a1 = A(),当类名加()时,首先执行的是A类中的__new__方法,如果没有就去父类中去读取,父类没有就去object中读取,object中是有这个方法的,object的__new__方法是需要传入类的,__new__会默认传入调用的类.并返回一个对象空间.
示例:
class A: def __init__(self,*args): self.name = args[0] self.age = args[1] def fun(self): pass def __new__(cls, *args, **kwargs): print(666) a1 = A("name",18) a1.name """ 这个示例跑的话会报错,因为__new__在类中有,而且这个类并不会返回一个对象空间,按下面改就可以了. """ class A: def __init__(self,*args): self.name = args[0] self.age = args[1] def fun(self): pass def __new__(cls, *args, **kwargs): print(666) return object.__new__(cls) a1 = A("name",18) p = a1.name print(p)
具体实例化对象的过程 是
'''
1,类名() 执行 __new__方法,先从自己的类中寻找,
如果没有找到,则从父类(直到object类)寻找,然后从object的__new__产生一个对象空间,返回给类名().
2,对象空间一旦产生并返回.则自动执行__init__方法,给这个对象空间封装属性.
3,最终你得到是封装好属性的对象空间.
'''
单例模式:对一个类只能实例化一个对象.重要,相当重要
python实现单例方式如下:
class A: __instance = None def __new__(cls, *args, **kwargs): if A.__instance is None: A.__instance = object.__new__(cls) return A.__instance a1 = A() a2 =A() a3 = A() print(a1,a2,a3)
__item__ 类中的的item方法
当一个对象,比如a1 对象,参考字典方法调用时,a1["name"],这时就会触发item方法的,
详细示例如下:
__getitem__(self,item)
class A: def __init__(self,*args): self.name = args[0] self.age = args[1] self.sex = args[2] def __getitem__(self, item): print(item) return item a1 = A("leon",18,"男") p = a1["name"] print(p)
__setitem__(self,key,value)
这个会把a1[值] = 值 括号里面的值传为key,赋的值传为value
示例:
class A: def __init__(self,*args): self.name = args[0] self.age = args[1] self.sex = args[2] def __getitem__(self, item): print(item) return item def __setitem__(self, key, value): print(key,value) def __delitem__(self, key): print(key) def __delattr__(self, item): print(item) a1 = A("leon",18,"男") p = a1["name"] print(p) a1["age"] = 20 del a1["sex"] print(a1.sex) del a1.name print(a1.name)
__delitem__这个是del a1[参数] 时把参数传给item
示例:
class A: def __init__(self,*args): self.name = args[0] self.age = args[1] self.sex = args[2] def __getitem__(self, item): print(item) return item def __setitem__(self, key, value): print(key,value) def __delitem__(self, key): print(key) def __delattr__(self, item): print(item) a1 = A("leon",18,"男") p = a1["name"] print(p) a1["age"] = 20 del a1["sex"] print(a1.sex) del a1.name print(a1.name)
__delattr__(self,item) 这个是当这样删除时,del a1.name时会把name传给item,
参考示例:
class A: def __init__(self,*args): self.name = args[0] self.age = args[1] self.sex = args[2] def __getitem__(self, item): print(item) return item def __setitem__(self, key, value): print(key,value) def __delitem__(self, key): print(key) def __delattr__(self, item): print(item) a1 = A("leon",18,"男") p = a1["name"] print(p) a1["age"] = 20 del a1["sex"] print(a1.sex) del a1.name print(a1.name)