面向对象中的特殊方法 --Python3

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (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 _ _方法有返回值且返回值是当前类创建的对象时才能被调用。

特定(相应)的语法会触发(对应)面向对象中的特殊方法。

猜你喜欢

转载自blog.csdn.net/Thanlon/article/details/94417533