版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)
文章目录
1、_ _ init _ _
类名():自动执行_ _ init _ _方法
# coding:utf-8
class Foo(object):
def __init__(self):
print('__init__')
f = Foo()
'''
__init__
'''
2、_ _ call _ _
对象():自动执行_ _ call _ _方法
# coding:utf-8
class Foo(object):
def __init__(self, name):
self.name = name
def __call__(self, *args, **kwargs):
print(args, kwargs)
f = Foo('Thanlon')
# 对象()自动执行__call__方法:无返回值,返回None
f(1, 2, 3, k1=123)
3、_ _ getitem _ _
对象[]:自动执行_ _ getitem _ _方法
# coding:utf-8
class Foo(object):
def __init__(self, name):
self.name = name
def __getitem__(self, item):
print(item)
return 'kiku'
f = Foo('Thanlon')
# 对象[]自动执行_ _getitem_ _方法
print(f['Love']) #
'''
Love
kiku
'''
4、_ _ setitem_ _
对象[‘xxx’] = xx:自动执行_ _ getitem _ _方法
# coding:utf-8
class Foo(object):
def __init__(self, name):
self.name = name
def __setitem__(self, key, value):
print(key, value)
f = Foo('Thanlon')
f['age'] = 23 # 这种方式的写法是没有返回值的
'''
age 23
'''
age传给key,23传给value,如:f[‘age’] = 23
5、_ _ delitem_ _
del 对象[xxx]:自动执行_ _ delitem_ _方法
# coding:utf-8
class Foo(object):
def __init__(self, name):
self.name = name
def __delitem__(self, key):
print(key)
f = Foo('Thanlon')
del f['Thanlon'] # # 这种方式的写法是没有返回值的
'''
Thanlon
'''
6、_ _ add _ _
对象+对象:自动执行_ _ add_ _方法
# coding:utf-8
class Foo(object):
def __init__(self, x):
self.x = x
def __add__(self, other):
return (self.x + other.x) # f1.x+f2.x
f1 = Foo(1)
f2 = Foo(2)
print(f1 + f2)
'''
3
'''
7、_ _ enter _ _ 与_ _ exit _ _
with 对象:自动执行_ _ enter _ 和 _ exit _ _方法
# coding:utf-8
class Foo(object):
def __init__(self, x):
self.x = x
def __enter__(self):
print('__enter__')
def __exit__(self, exc_type, exc_val, exc_tb):
print('__exit__')
f1 = Foo(1)
with f1:
print('with中的code!')
as接收_ _ enter _ _方法的返回值:
# coding:utf-8
class Foo(object):
def __init__(self, x):
self.x = x
def __enter__(self):
print('__enter__')
return 'return value '
def __exit__(self, exc_type, exc_val, exc_tb):
print('__exit__')
f1 = Foo(1)
with f1 as f:
print(f)
print('with中的code!')
'''
__enter__
return value
with中的code!
__exit__
'''
8、_ _ new _ _
类():其实先执行_ _ new _ _方法,再执行 _ _ init _ _方法
# coding:utf-8
class Foo(object):
def __init__(self):
print('__init__')
def __new__(cls, *args, **kwargs):
print('__new__')
f1 = Foo()
'''
_ _new_ _
'''
程序执行了_ _ new_ _ 方法,打印了“_ _ new_ _”。但是,没有执行 _ _ new _ _方法中的print('__init__')
语句,说明:先执行的是 _ _ new _ _方法,后执行 _ _ init _ _方法。
# coding:utf-8
class Foo(object):
def __init__(self, name): # 初始化方法
'''
初始化空的对象(__new__方法返回的空对象)或者说为空对象进行数据初始化
:param name:
'''
self.name = name
print('__init__')
def __new__(cls, *args, **kwargs): # 构造方法
'''
创建一个当前类的空对象
:param args:
:param kwargs:
:return:
'''
print('_ _new_ _')
# 所有的对象都是object创建的
return object.__new__(cls) # Python内部创建一个当前类的空对象(该对象的内部是空的)
f1 = Foo('Thanlon') # 这个对象实际上是由以上两个方法创建的
'''
_ _new_ _
__init__
'''
_ _ init _ _方法只有在 _ _ new _ _方法有返回值且返回值是当前类创建的对象时才能被调用。
特定(相应)的语法会触发(对应)面向对象中的特殊方法。