特殊成员
Posted yangzilaing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了特殊成员相关的知识,希望对你有一定的参考价值。
特殊成员
-
1.初始化方法 "_init_"
#用于给对象中赋值,初始化方法 ‘‘‘ 顶头是py文件的注释 ‘‘‘ class Foo: ‘‘‘ 类的注释 ‘‘‘ def __init__(self,a1): ‘‘‘ 方法的注释 初始化方法 :param a1: ‘‘‘ self.a1 = a1 #1.创建一个空白对象,obj #2.执行__init__,给对象中进行赋值(初始化) obj = Foo("yang")
-
2.__new__方法(构造方法)
#new方法(构造方法)是用来帮助创建空对象的 class Foo(object): def __init__(self): print("给对象进行赋值") self.x = 123 def __new__(cls,*args,**kwargs): print("创建对象") return object.__new__(cls) #返回什么,obj就等于什么 obj = Foo() #当创建对象时先执行__new__再执行__init__方法
-
3_call_
#对象后面加括号,执行__call__方法 class Foo(object): def __init__(self): print("给对象进行赋值") self.x = 123 def __new__(cls,*args,**kwargs): print("创建对象") return object.__new__(cls) #返回什么,obj就等于什么 def __call__(self,*arg,**kwargs): print("执行call方法") # obj = Foo() # obj() Foo()() #当创建对象时先执行__new__再执行__init__方法
-
4._getitem_ setitem _delitem_
#语法的对应关系,是只关于字典的吗?这是一个问题???其实看样子是只关于字典的 class Foo(object): def __setitem__(self, key, value): print(key,value) def __getitem__(self,item): #此处的item就是“xxx” return item + "uuu" #为其返回值 def __delitem__(self,key): pass obj1 = Foo() obj1["k1"] = 123 #内部会自动调用__settitem__方法: val = obj1["xxx"] #内部会自动调用__getitem__方法进行取值 print(val) del obj1["ttt"] #内部会自动调用__delitem__方法
-
5_str_
class Foo(object): def __str__(self): ‘‘‘ 只有在打印对象时,会自动化调用此方法,并将其返回值在页面显示出来 :return: ‘‘‘ return "kasguuas" obj = Foo() print(obj) #打印的时候执行__str__返回的内容,对象还是原来的对象,不会影响obj的值,只在打印的时候调用__str__
#__str__应用示例 #改进前 class User(object): def __init__(self,name,email): self.name = name self.email = email user_list = [User("二狗","2g@qq.com"),User("二蛋","2d@qq.com"),User("狗蛋","gd@qq.com")] for item in user_list: print(item.name,item.email) #改进后 class User(object): def __init__(self,name,email): self.name = name self.email = email def __str__(self): return "%s %s"%(self.name,self.email) user_list = [User("二狗","2g@qq.com"),User("二蛋","2d@qq.com"),User("狗蛋","gd@qq.com")] for item in user_list: print(item) #当print对象时便触发__str__e
-
6_dict_
#去对象中找到所有变量并将其装换为字典 class Foo(object): def __init__(self,name,age,email): self.name = name self.age = age self.email = email obj = Foo("yang",19,"xxxx@qq.com") print(obj.name) print(obj.age) print(obj.email) val = obj.__dict__ #去对象中找到所有变量并将其装换为字典 print(val) ‘‘‘ yang 19 xxxx@qq.com {‘name‘: ‘yang‘, ‘age‘: 19, ‘email‘: ‘xxxx@qq.com‘} ‘‘‘
-
上下文管理
class Foo():
def __enter__(self):
self.x = open("a.text",mode="a",encoding="utf-8")
return self.x
def __exit__(self, exc_type, exc_val, exc_tb):
self.x.close()
with Foo() as ff: #ff为enter的返回值
ff.write("yang")
‘‘‘
思考:
这样做的目的是什么?
1.open应该是一个内置的函数,是封装好的函数。这里是把open扒开了进行解析,
由此可以看出open应该包含两个函数,但不是完全的,因为我们在调用函数后还要对函数进行关闭
2.这里面进行了好几次的对象的传递,所以精简了许多中间的传递布置
‘‘‘
#面试题
class Context:
def __enter__(self):
print("进入")
return self #此处实际上是对ctx进行传参
def __exit__(self, exc_type, exc_val, exc_tb):
print("退出")
def do_something(self):
print("内部执行")
with Context() as ctx: #参数之间进行传递,比直接调用显得麻烦,但就是函数内部的逻辑
ctx.do_something()
-
两对象相加
class Foo(object): def __add__(self, other): return 123 #返回什么val就是什么,pass时返回的为相加的函数 obj1 = Foo() obj2 = Foo() val = obj1 + obj2 #obj1首先触发__add__,即self为obj1,other为obj2 print(val)
总结:特殊方法就是为了能够快速执行某种方法而生的
以上是关于特殊成员的主要内容,如果未能解决你的问题,请参考以下文章