现在推广网站最好的方式,网站建设合同内容,宁波企业seo外包,东阳科技网站建设一、什么是魔术方法
Python中像__init__这类双下划线开头和结尾的方法#xff0c;统称为魔术方法魔术方法都是Python内部定义的#xff0c;自己不要去定义双下划线开头的方法
二、__new__
重写new方法时#xff0c;一定要调用父类的new方法来完成对象的创建#xff0c;并…一、什么是魔术方法
Python中像__init__这类双下划线开头和结尾的方法统称为魔术方法魔术方法都是Python内部定义的自己不要去定义双下划线开头的方法
二、__new__
重写new方法时一定要调用父类的new方法来完成对象的创建并将对象返回出去参数cls代表的是类对象本身
class MyClass(object):def __init__(self, name):self.name name #new方法返回一个类对象 __init__才可进行初始化def __new__(cls, *args, **kwargs):print(这是new方法)# 子类调用父类object中的new方法并返回# return super().__new__(cls)return object.__new__(cls) # 推荐写法m MyClass(丸子) # 重写new方法后 对象为None了 需return
print(m.name)
三、单例模式
单例模式可以节约内存也可以设置全局属性类每次实例化的时候都会创建一个新的对象不管实例化多少次始终只返回一个对象就是第一次创建的那个对象
class MyTest(object):__isinstance None # 设置一个类属性用来记录这个类有没有创建过对象(__isinstance私有属性 防止修改)def __new__(cls, *args, **kwargs):# 方法中不能直接调用类属性,需通过类名MyTest 或cls调用if not MyTest.__isinstance: # 为空cls.isinstance object.__new__(cls) # object.__new__(cls) 创建了对象return cls.__isinstance # 类属性接收到的就是上一行创建的对象else:return cls.__isinstancet1 MyTest()
t1.name wanzi
t2 MyTest() # 返回的仍然是t1
print(t2.name)
print(t1的内存地址,id(t1))
print(t2的内存地址,id(t2))四、__str__和__repr__
1、str给用户看的repr给程序员看的接近创建时的状态具体显示哪个类的方法
2、str方法注释后会触发repr方法repr方法注释后 repr()不会返回str
3、str和repr均注释后找父类object中的方法
4、str有3种方式被触发
print(m)str(m)format(m)
5、repr有2种方式被触发
1种是交互环境,控制台输入ipython后编写代码1种是repr()
class MyClass(object):def __init__(self, name):self.name namedef __str__(self): # 重写__str__ 必须return字符串print(str被触发了)return self.namedef __repr__(self): # 重写__repr__ 必须return字符串print(repr被触发了)return MyClass.object-{}.format(self.name)def __call__(self, *args, **kwargs):# 对象像函数一样调用的时候触发print(----call----)m MyClass(youyou)
# str有3种方式被触发
# print(m)
# str(m)
# format(m)
# repr有2种方式被触发 1种是交互环境 1种是repr()
res repr(m)
print(res) 五、__call__
TypeError: MyClass object is not callable 六、__add__和__sub__
字符串相加减若没有__str__方法 print(s1,s2)时会输出对象的默认表示 比如 __main__.MyStr object at 0x...不是内容本身
# 字符串加减法 __add__ __sub__
class MyStr(object):def __init__(self, data):self.data datadef __str__(self):# 若没有此方法 print(s1,s2)时会输出对象的默认表示比如 __main__.MyStr object at 0x...不是内容本身return self.datadef __add__(self, other): # other就是个普通参数 其他对象return self.data other.datadef __sub__(self, other):return self.data.replace(other.data,) # 字符串相减s1 MyStr(sss1) # self为s1
s2 MyStr(sss2) # other为s2
print(s1 s2) # 等同于s1.__add__(s2)
print(s1 - s2) # 等同于s1.__sub__(s2)
七、上下文管理器
1、上下文管理器的概念
上下文管理器是一个Python对象为操作提供了额外的上下文信息。这种额外的信息在使用with语句初始化上下文以及完成with块中的所有代码时采用可调用形式
object.__enter__(self) 输入与此对象相关的运行时上下文如果存在则with语句将绑定该方法的返回值到该语句的as子句中指定的目标
object.__exit__(self, exc_type, exc_val, exc_tb) 退出与此对象相关的运行上下文参数描述导致上下文退出的异常。
①如果该上下文退出时没有异常三个参数都将为None。
②如果提供了一个异常并且该方法希望抑制该异常它应该返回一个真值。否则在退出此方法后异常将被正常处理
注意__exit__()方法不应该重新抛出传递进去的异常这是调用者的责任
2、上下文管理器的实现
如果在一个类中实现了__enter__和__exit__两个方法那么这个类就可以当做一个上下文管理器 # with open(test.txt,w,encodingutf8) as f:
# f.write(我是丸子啊)# with后面跟的是一个上下文管理器对象class MyOpen(object):# 文件操作的上下文管理器类def __init__(self, file_name,open_method, encodingutf-8):self.file_name file_nameself.open_method open_methodself.encoding encodingdef __enter__(self):self.f open(self.file_name,self.open_method,encodingself.encoding)return self.f # 返回的内容等同于with open() as f中的fdef __exit__(self, exc_type, exc_val, exc_tb)::param exc_type: 异常类型:param exc_val: 异常值:param exc_tb: 异常追踪:return:print(exc_type,exc_type)print(exc_val,exc_val)print(exc_tb,exc_tb)self.f.close()
自定义一个上下文管理器
# 通过MyOpen类创建一个对象with处理对象时会自动调用enter魔术方法
with MyOpen(test.txt, r) as f: #f 是文件操作的一个句柄文件操作的I/O对象content f.read()print(content)
#with方法执行结束后 触发exit方法