python -- 面向对象 -- 特殊成员方法

python -- 面向对象 -- 特殊成员方法

__doc__ 类的描述信息

class Foo(object):
    '''这个是一个普通的类'''
    pass

print(Foo.__doc__)  # 这个是一个普通的类

__module__ 和 __class__

  • __module__表示当前操作的对象在那个模块

  • __class__表示当前操作的对象的类是什么

__init__构造方法,通过类创建对象时,自动触发执行。

__del__ 析构方法,当对象在内存中被释放时,自动触发执行。

__call__ 对象后面加括号,触发执行。

class Foo(object):

    def __call__(self, *args, **kwargs):
        print('WTF? {0} {1}'.format(args,kwargs))

obj1 = Foo()
# 以下就是__call__的用法,可以再加上括号执行。
obj1(1,2,3,4,5,name='Gao', age = '30')  # obj1()


'''
以下是程序的结果:
WTF? (1, 2, 3, 4, 5) {'name': 'Gao', 'age': '30'}
'''

__dict__ 查看类或对象中的所有成员。

class Foo(object):

    def a(self):
        pass

    def __call__(self, *args, **kwargs):
        print('WTF? {0} {1}'.format(args,kwargs))


# 使用__dict__方法,是不需要实例化类,就可以使用
print(Foo.__dict__)
class Foo(object):

    def __init__(self, name, age):
        self.NAME = name
        self.AGE = age

    def a(self):
        pass

    def __call__(self, *args, **kwargs):
        print('WTF? {0} {1}'.format(args,kwargs))


# 使用__dict__方法,是不需要实例化类,就可以使用,不打印实例的属性
print(Foo.__dict__)

# 实例化后再使用__dict__,只打印实例的属性,不再打印类的属性
obj1 = Foo('Gao', '30')
print(obj1.__dict__)  # {'NAME': 'Gao', 'AGE': '30'}

__str__ 查看类或对象中的所有成员。

class Foo(object):

    def __init__(self, name, age):
        self.NAME = name
        self.AGE = age

    def __str__(self):
        return '<obj:{0}>'.format(self.NAME)

# 使用__str__方法,可以看到对象的信息,如果不加__str__就会显示相对不太友好的内容
# 注意__str__的写法,使用return

print(Foo)
obj1 = Foo('Gao', '30')
print(obj1)

'''
以下是程序的结果:
<class '__main__.Foo'>
<obj:Gao>
'''

__getitem__ __setitem__ __delitem__

class Foo(object):

    data = {}

    def __init__(self, name, age):
        self.NAME = name
        self.AGE = age
        # self.data = {}  # 这里的效果在某种场景下同上面的data={}

    def __getitem__(self, key):
        print('触发了 __getitem__ : ', key)
        return self.data.get(key)

    def __setitem__(self, key, value):
        print('触发了 __setitem__ : ', key, value)
        self.data[key] = value

    def __delitem__(self, key):
        print('触发了 __delitem__ :', key)

obj1 = Foo('Gao', 30)

# 以下就触发了__getitem__的用法
res = obj1['key']
# 以下就触发了__setitem__的用法
obj1['key_1'] = 'value_1'
print("This's the dict of data in the class of Foo: ",obj1.data)
# 以下就触发了__delitem__的用法,key3不在data字典中,也是可以被调用
del obj1['key3']


'''
以下是程序的结果:
触发了 __getitem__ :  key
触发了 __setitem__ :  key_1 value_1
This's the dict of data in the class of Foo:  {'key_1': 'value_1'}
触发了 __delitem__ : key3
'''
posted @ 2017-10-09 15:58  gzz041  阅读(192)  评论(0)    收藏  举报