python中常见的双下方法_python面向对象(5)__特殊双下方法

双下方法

双下方法是开发python这个语言程序员用的,源码中使用的.

我们不能轻易使用双下方法.可能重新写object的源码,慎用!!!

双下方法特征:你不知道干啥了,就会触发某个双下方法

len

class B:

def__len__(self):

print("666")

return 555

b=B()

len(b)

打印结果如下

666

hash

class A:

pass

obj=A()

print(obj)

打印结果如下

可哈希值

str

优先级高于repr

class A:

def __init__(self,name,age):

self.name=name

self.age=age

def __str__(self):

return f"姓名:{self.name}年龄{self.age}"

a=A("sykrabbit ",20)

print(a)

打印结果如下

姓名:sykrabbit 年龄20

repr

优先级低于str

必须有return

class A:

def __init__(self,name,age):

self.name=name

self.age=age

def __repr__(self)

print(66)

打印结果如下

66

call

对象()自动触发对象从属于类(父类)的__call__方法

object没有call方法

class Foo:

def __init__(self):

pass

def __call__(self, *args, **kwargs):

print('__call__')

obj = Foo() # 执行 __init__

obj() # 执行 __call__

打印结果如下

__call__

eq

比较大小

class A:

def __init__(self,name,age):

self.name=name

self.age=age

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

析构方法

class A:

def __del__(self):

print(666)

obj=A()

打印结果如下

666

new

在内存当中开辟一个空间产生对象

class A:

def __init__(self):

self.x = 1

print('in init function')

def __new__(cls, *args, **kwargs):

print('in new function')

return object.__new__(A, *args, **kwargs)

#对象是object类的__new__方法 产生了一个对象

a = A()

#类名()

#1.先触发object的__new__方法,此方法在内存中开辟一个对象空间

#2.先执行__init__方法,给对象封装属性

print(a.x)

打印结果如下

in new function

in init function

单例模式

单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。

一个类只允许实例化一个对象

__item__系列

进行类型字典的增删改查

class Foo:

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):

print('del obj[key]时,我执行')

self.__dict__.pop(key)

def __delattr__(self, item):

print('del obj.key时,我执行')

self.__dict__.pop(item)

f1=Foo('sb')

f1['age']=18

f1['age1']=19

del f1.age1

del f1['age']

f1['name']='alex'

print(f1.__dict__)

上下文管理器相关

enter __exit__都是成对的出现

# 如果想要对一个类的对象进行with as 的操作 不行。

class A:

def __init__(self, text):

self.text = text

with A('大爷') as f1:

print(f1.text)

没他们不可以这样操作

class Diycontextor:

def __init__(self,name,mode):

self.name = name

self.mode = mode

def __enter__(self):

print "Hi enter here!!"

self.filehander = open(self.name,self.mode)

return self.filehander

def __exit__(self,*para):

print "Hi exit here"

self.filehander.close()

with Diycontextor('py_ana.py','r') as f:

for i in f:

print i

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值