python之魔法方法
Posted pathping
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python之魔法方法相关的知识,希望对你有一定的参考价值。
is 和 == 的关系
‘‘‘ == 值相等 值运算 is 内存地址相等 身份运算 is 要求更苛刻 不仅要求值相等,还要求内存地址相同 ‘‘‘ a = 111 b = 111 a == b # 值相等 值运算使用 a is b # 值相等内存地址不相等使用
is 和 isinstance的关系
class A: pass class B(A): pass b = B() print(isinstance(b, B)) print(isinstance(b, A)) print(issubclass(B, A)) class Mystr(str):pass ms = Mystr(‘alex‘) print(ms) print(type(ms) is str) # 不包含继承关系,只管一层 print(isinstance(‘alex‘, str)) # 包含所有的继承关系
__call__方法 相当于 对象()
class A: def __call__(self, *args, **kwargs): print(‘执行call方法了‘) def call(self): print(‘执行call方法了‘) class B: def __init__(self,cls): print(‘在实例化A之前做一些事情‘) self.a = cls() self.a() print(‘在实例化A之后做一些事情‘) a = A() a() # 对象() == 相当于调用__call__方法 a.call() A()() # 类名()() ,相当于先实例化得到一个对象,再对对象(),==>和上面的结果一样,相当于调用__call__方法 B(A)
iter和next例子
# iter和next的例子 # __iter__ iter(obj) # __next__ next def iter(obj): return obj.__iter__() # 返回迭代对象 li = [1,2,3] print(iter(li))
__len__方法
class Mylist: def __init__(self): self.li = [1,2,3] def __len__(self): print(‘len‘) # return len(self.li) return len(self.__dict__) # 有多少个属性 l = Mylist() print(len(l)) # len(obj)相当于调用了这个对象的__len__方法 # __len__方法return的值就是len函数的返回值 # 如果一个obj对象没有__len__方法,那么len函数会报错 # 练习 写一个类 统计str的长度 # self.s = ‘‘ len(obj) = str的长度 class StrLen: def __init__(self,s): self.s = s def __len__(self): return len(self.s) b = StrLen(‘adsgsdg‘) print(len(b))
__new__ # 构造方法 开劈内存空间的类的构造方法
__init__ # 初始化方法
class Single: def __new__(cls, *args, **kwargs): # 在实例化之后,__init__之前先执行new来创建一块空间 obj = object.__new__(cls) # Single的new,Single没有,只能调用object的new方法 print(‘new‘, obj) return obj def __init__(self): print(‘init‘, self) # 1、开辟一个空间,属于对象的 # 2、把对象的空间传给self,执行init # 3、将这个对象的空间返回给调用者
单例类
# 单例类 class single: __ISINSTANCE = None def __new__(cls, *args, **kwargs): if not cls.__ISINSTANCE: cls.__ISINSTANCE = object.__new__(cls) return cls.__ISINSTANCE def __init__(self,name,age): self.name = name self.age = age # 不论实例多少个对象结果都是同一个内存空间 a = single(‘alex‘,32) b = single(‘wang‘, 43) print(a.name) print(b.name)
__str__ 方法
class Student: def __str__(self): ‘‘‘ :return: 返回自定义内容 ‘‘‘ return f"self.school self.class_name self.name self.age" def __init__(self, school, class_name, name): self.school = school self.class_name = class_name self.name = name self.age = 20 name1 = Student(‘oldboy‘, ‘py‘, ‘alex‘) name2 = Student(‘oldboy‘, ‘py‘, ‘abc‘) print(name1) # 直接调用对象输出自定义内容,需要使用__str__方法 print(str(name1)) # 内置的数据类型,内置的类,相当于执行__str__ print(‘学生: %s‘ % name1) print(f‘学生:name1‘) # print一个对象相当于调用一个对象的__str__方法 # str(obj),相当于执行obj.__str__方法 # ‘%s‘%obj,相当于执行obj.__str__方法
以上是关于python之魔法方法的主要内容,如果未能解决你的问题,请参考以下文章