双下方法
Posted daviddd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了双下方法相关的知识,希望对你有一定的参考价值。
双下方法
定义:
- 双下方法是特殊方法
- 原来是Python这个语言的程序员用于源码使用的
- 一种特殊的机制:你不知道你干了什么就触发了某个双下方法
len
# class B: # # def __init__(self,name,age): # self.name = name # self.age =age # # def __len__(self): # print(self.__dict__) # # return len(self.__dict__) # 2 # # b = B('leye',28) # # print(len(b))
hash
类的实例化对象也是可哈希的
可哈希对象得到哈希值
# class A(object): # # pass # # obj = A() # print(hash(obj)) # print(hash('fdsaf')) -9223371858122639079 8102982483253201962
str
开发应用比较多
打印对象触发__str__方法
print(对象)默认输出该方法的返回值
# class A: # # def __init__(self,name,age): # self.name = name # self.age =age # # def __str__(self): # return f'姓名: {self.name} 年龄: {self.age}' a = A('DAVID',12) b = A('ASDF',13) c = A('QWER',14) print(a) print(b) print(c) 姓名: DAVID 年龄: 12 姓名: ASDF 年龄: 13 姓名: QWER 年龄: 14 print(str(a))
直接str转化也可以触发
repr
原形毕露:是什么就打印什么,包括引号
和str类似,但是优先级低于str
如果一个类中定义了__repr__方法,那么在print(repr(对象))时默认的到该方法的返回值
class A: def __init__(self,name,age): self.name = name self.age =age def __repr__(self): return 666 def __str__(self): return f'姓名: {self.name} 年龄: {self.age}' a = A('DAVID',12) b = A('ASDF',13) c = A('QWER',14) print(a) print(b) print(c) 优先执行——str—— 姓名: DAVID 年龄: 12 姓名: ASDF 年龄: 13 姓名: QWER 年龄: 14
call
对象+():自动触发对象从属于类(父类)的__call__方法
class Foo: def __init__(self): pass def __call__(self, *args, **kwargs): print('__call__') obj = Foo() obj() __call__
ep
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 a = A() b = A() print(a == b) True
del
- 析构方法:对象在内存中被释放时,自动触发执行
- 析构函数的调用时由解释器在进行垃圾回收时自动触发的
new
对象是object类的__new__方法,产生了一个对象
类名()
- 先触发object的__new__方法,此方法在内存中开辟一个对象空间
- 执行__init__方法,(给对象封装属性)
obj = 类名()
接上面
自动将对象地址传给__init__的self
运行__init__方法中的代码,给对象封装属性
class A(object): #步骤 def __init__(self): #5 self.x = 1 print('in init function') #6 def __new__(cls, *args, **kwargs): #2 print('in new function') #3 return object.__new__(A) #4 a = A() #1 print(a) #7 打印结果 in new function in init function <__main__.A object at 0x0000019399779198>
item
class Func(): def __init__(self,name): self.name = name def __getitem__(self,item): print(self.__dict__[item]) def __setitem__(self,key,value): self.__dict__[key] = value def __delitem__(self,key): self.__dicy__.pop(key) def __delattr__(self,key): self.__dict__.pop(key) obj = A('alwx') obj['age'] = 18 obj['hobby'] = 19 del obj['age'] del obj['hobby'] del obj.age obj['name'] = 'david'
上下文管理
- enter ,exit
- 必须同时使用
以上是关于双下方法的主要内容,如果未能解决你的问题,请参考以下文章