python之魔法方法
2020-12-13 16:49
标签:student one iter instance 多少 ini class 单例 构造 __len__方法 单例类 __str__ 方法 python之魔法方法 标签:student one iter instance 多少 ini class 单例 构造 原文地址:https://www.cnblogs.com/pathping/p/11621683.htmlis 和 == 的关系
‘‘‘
== 值相等 值运算
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))
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)
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__方法