1 __doc__:python自建,无需定义。说明文档和信息

class Foo:
    
    """描述类信息,可自动被收集"""
    
    def func(self):
        pass
    
print (Foo.__doc__)



描述类信息,可自动被收集

2 __init__():实例化方法,通过类创建实例,自动触发执行

3 __module__ 和 __class__:前者标识当前操作的对象在属于哪个模块;后者标识当前操作的对象属于哪个类

class Foo:
    
    pass

obj = Foo()
print(obj.__module__)
print(obj.__class__)


__main__
<class '__main__.Foo'>

4 __del__():析构方法,当对象在内存中被释放时,自动触发此方法,无序定义,除非指定动作

class Foo:
    
    def __del__(self):
        print("我被回收了")
        
obj = Foo()
del obj


我被回收了

5 __call__():如果为一个类编写了该方法,那么在该类的实例后边加括号,可调用此方法。一般构造函数通过对象=类名()执行,但__call__()是有对象加括号后触发,即对象()或者类()。

  通过callable()函数测试对象可否被执行。

class Foo:

    def __init__(self):
        pass

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

obj = Foo()
obj()

__call__

6 __dict__:列出类或者对象中所有成员。自建无序定义。

class Province:

    country = 'China'
    def __init__(self,name,count):
        self.name = name
        self.count = count

    def func(self,*args,**kwargs):
        print('func')

#获取类的成员
print(Province.__dict__)

#获取对象obj1的成员
obj1 = Province('HeBei',10000)
print(obj1.__dict__)

#获取对象obj2的成员
obj2 = Province('HeNan',3888)
print(obj2.__dict__)


{'__module__': '__main__', 'country': 'China', '__init__': <function Province.__init__ at 0x0000022F4633DA60>, 'func': <function Province.func at 0x0000022F4633DAE8>, '__dict__': <attribute '__dict__' of 'Province' objects>, '__weakref__': <attribute '__weakref__' of 'Province' objects>, '__doc__': None}
{'name': 'HeBei', 'count': 10000}
{'name': 'HeNan', 'count': 3888}

7 __str__()

8 __getitem__(),__setitem__(),__delitem__():取值,赋值,删除。Python中标识符后加括号,代表调用。加中括号[],代表取值。三成员用于执行与中括号有关的动作。

a = 标识符[] :   执行__getitem__方法
标识符[] = a  :   执行__setitem__方法
del 标识符[] :   执行__delitem__方法

如果有一个类同时定义了这三个魔法方法,那么这个类的实例的行为看起来就像一个字典一样,如下例所示:

class Foo:

    def __getitem__(self,key):
        print('__getitem__',key)

    def __setitem__(self,key,value):
        print('__setitem__',key,value)

    def __delitem__(self,key):
        print('__delitem__',key)

obj = Foo()
result = obj['k1']
obj['k2'] = 'jack'
del obj['k1']

__getitem__ k1
__setitem__ k2 jack
__delitem__ k1

9 __iter__():

10 __len__()

11 __repr__();与__str__()的区别:前者返回开发者看到的字符,后者返回用户看到的字符串。为调试服务,通常代码一样。

12 __add__;__sub__;__mul__;__div__;__mod__;__pow__

13 __author__

14 __slots__:python可以在定义类或实例化后,给类或者对象继续添加随意个或任意类型的变量或方法,动态语言特性。如果限制实例可以添加的变量,使用__slots__。

  仅对当前类有效,对子类无效。

def print_doc(self):
    print('haha')

class Foo:
    __slots__ = ('name','age')
    pass

obj1 = Foo()
obj2 = Foo()

#动态添加实例变量
obj1.name='jack'
obj2.age = 18
obj1.sex = 'male'   #会弹出错误

#动态添加实例方法,__slots__无法限制给类添加方法
Foo.show = print_doc
obj1.show()
obj2.show()

 

posted on 2018-09-03 17:09  voldermorter  阅读(114)  评论(0)    收藏  举报