特殊方法
# class F: # pass # class A(F): # pass # class B(A): # pass # class C: # pass # obj1 = B() # print(isinstance(obj1,B)) # print(isinstance(obj1,A)) # print(isinstance(obj1,F)) # isinstance 这个对象是本类实例化的,或者是此类的派生类实例化出来的. # print(isinstance(obj1,C)) # print(issubclass(C,B)) # issubclass:判断一个类是否是另一个类的派生类. # print(issubclass(B,A)) # print(issubclass(B,F))
# __len__, __hash__ __str__ __repr__ # print(dir(list)) # print(dir(str)) # l1 = list([1, 1, 2, 3]) # 是list类实例化的一个对象 # print(len(l1)) # 对一个对象len(),则他会执行这个对象从属于的类 的__len__方法 # class A: # def __init__(self,name,age): # self.name = name # self.age = age # # a1 = A('oldboy',1000) # print(len(a1)) # 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)) # 如果对一个对象进行len()操作, # 他会找到对象从属于的类中的__len__方法,并且此方法中必须要有数字的返回值. # __hash__ # class A: # def __init__(self,name,age): # self.name = name # self.age = age # # # def __len__(self): # # return len(self.__dict__) # def __hash__(self): # return 100 # a1 = A('oldboy',1000) # print(hash(a1)) # __str__ __repr__ # class A: # def __init__(self,name,age): # self.name = name # self.age = age # # def __str__(self): # return 'alex' # a1 = A('oldboy',1000) # # print(a1) # <__main__.A object at 0x000000000237E908> # print(str(a1),type(str(a1))) # '<__main__.A object at 0x000000000237E908>' # class A: # # def __init__(self): # pass # def __str__(self): # print(666) # return '太白' # a = A() # print(a) # 打印对象,就会触发类中__str__方法 # str(a) # str(a),就会触发类中__str__方法 # print('打印此类对象:%s' % a) # 格式化输出 '%s'a # class A: # def __init__(self): # pass # def __repr__(self): # return '太白' # a = A() # print(repr(a)) # print('%r'%a) # msg = '飞哥说他是%s,他真%r,%s,%s' % ('sb','NB',666,6.66) # print(msg)
# *** __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)) # 对象() 自动执行类中的__call__方法
# __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) # 对一个类实例化的两个对象进行比较运算的时候,他会自动触发类中的__eq__
# python垃圾回收机制 # :文件中你创建的所有的变量,类等等.执行完毕之后, # 一段时间内如果没有用到, 他会自动在内存中去除. # 深入研究: 他会将你的所有变量,类等等做个标记,在一段时间之内,没有被调用,则就会自动回收. # __del__ 析构方法 # class A: # def __init__(self): # pass # def __del__(self): # print(666) # a1 = A()
# *** __new__ : object产生并返回一个对象空间. # 自己定义的__new__ 第一个参数自动接收类空间. # 执行顺序:先执行__new__方法,然后在执行__init__方法 # class A: # def __init__(self): # self.x = 1 # print('in init function ') # # def __new__(cls, *args, **kwargs): # print(cls) # <class '__main__.A'> # print('in new function ') # # return object.__new__(cls) # 调用object类中的__new__方法,产生一个真正的对象空间 # return super().__new__(cls) # 返回给 A() # object # a1 = A() # print(a1) # print(a1) # 类名() 自动执行类中__new__ 类中没有,则找到object # 找到__new__ 这个方法是产生一个对象空间,自动执行类中的__init__,给这对象空间封装一些属性, # 最后返回给A() 然后给 变量a1 # print(a1.x)
# class A1: # def __new__(cls, *args, **kwargs): # '产生对象空间' # pass # # class B(A1): # def __init__(self): # self.x = 1 # def __new__(cls, *args, **kwargs): # print('B1') # b1 = B() # print(b1) # 最详细版本: ''' 1,类名() 执行 __new__方法,先从自己的类中寻找, 如果没有找到,则从父类(直到object类)寻找,然后从object的__new__产生一个对象空间,返回给类名(). 2,对象空间一旦产生并返回.则自动执行__init__方法,给这个对象空间封装属性. 3,最终你得到是封装好属性的对象空间. '''
# 设计模式: 单例模式. 最简单的设计模式. 面试必考,默写. # 单例模式: 对一个类是能实例化一个对象. # class A: # pass # a1 = A() # b1 = A() # c1 = A() # d1 = A() # print(a1,b1)
# class A:
# __instance = None
# def __new__(cls, *args, **kwargs):
# if A.__instance is None: # 第一次进入,满足这个条件
# obj = object.__new__(cls) # 利用object 创建一个对象空间 给了obj
# A.__instance = obj # 我将类的私有静态字段 __instance 重新赋值了 对象空间obj
# return A.__instance
# a1 = A()
# b1 = A()
# c1 = A()
# print(a1,b1,c1)
# *** item class Foo: def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def __getitem__(self, item): print(self.__dict__[item]) if hasattr(self,item): return getattr(self,item) else: return '没有此属性' # return getattr(self, item, '没有此属性') # def __setitem__(self, key, value): # print(key,value) # # def __delitem__(self, key): # print(key) # # def __delattr__(self, item): # print(item) # print('del obj.key时,我执行') f1 = Foo('alex', 12, '男') print(f1['name']) # 对一个对象使用f1['name1']这种方法,自动触发__getitem__这个方法,将'oldboy123' 传到这个方法中. # print(f1['age1']) # f1['name1'] = 'wusir666' # del f1['fkjdslfjdslafj'] # 如果你对对象进行相似的字典的操作,就会主动触发类中__getitem__ __setitem__ delitem__ # del f1.name # del f1.aaaaaa