类的魔法方法

1:_doc_

这是类的文档注释

class T:
    '''
    这是类T的注释文档
    '''
    
print(T.__doc__) # 这是类T的注释文档
obj = T()
print(obj.__doc__) # 这是类T的注释文档

2.__module__和__class__的用法

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

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

from multiprocessing import Process


def test():
    pass

if __name__ == "__main__":
    p1 = Process(target=test)
    print(p1.__module__)  #  multiprocessing.context 类所在的模块
    print(p1.__class__)  # <class 'multiprocessing.context.Process'> 类名

3:__init__

构造方法,在调用类时自动触发

class Teacher():
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def run(self):
        pass
print(Teacher.name)  # 报错没有这个属性 

ojb = Teacher('beautify',18)
print(ojb.name)  # beautify
print(ojb.age)  # 18
  
print(Teacher('beautify',18).name) # beautify
print(Teacher('beautify',18).age)  # 18

4.__del__

当对象运行结束时,自动触发这里的方法,一般是用于垃圾回收

注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的

import time
class Bar():
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __del__(self):
        print("运行结束")
		
        
ojb = Bar('alen',88)
print(ojb.name)  # alen
print(ojb.age)  # 88
time.sleep(1)

def test():
    pass

test()
# 当次页面执行结束时,__del__自动触发

5.__call__

对象加括号可以执行。

注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

class Bar():
    def _init__(self):
        self.name = name
        self.age = age
        
   	
    def __call__(self,*args,**kwargs):
        print('这就是call方法')
        return Bar(*args,**kwargs)

    
obj = Bar('alen', 88)
test = obj('alex', 18)  # 对象调用方法,产生对象
print(test.name)
print(test.age)

6.__dict__

类或对象中的所以成员

类的普通字段属于对象;类中的静态字段和方法等属于类·

class Peopel(object):
    province = 'cn'
    def __init__(self,name,count):
        self.name = name
        self.count = count
        
     def test(sefl,*args,**kwargs):
        print("这是一个测试函数")
        
print(Peopel.__dict__)  # 查看类的属性(静态,字段,方法)
# {'__module__': '__main__', 'province': 'cn', '__init__': <function People.__init__ at 0x000001953227B280>, 'test': <function People.test at 0x000001953227B1F0>, '__dict__': <attribute '__dict__' of 'People' objects>, '__weakref__': <attribute '__weakref__' of 'People' objects>, '__doc__': None}

obj1 = People('alex',8)
print(obj1.__dict__)  # {'name': 'alex', 'count': 18}
obj2 = People('alex',28)  # {'name': 'alex', 'count': 28}

7:__str__

如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。

class Foo:
    
    def __init__(self,name,age):
        self.name = name
        self.age = age
        
    def __str__(self):
        return f'<{self.name}>'
    
alex = Foo('alex',18)
print(alex)  # <alex> 

8:__repr__

这个方法和__str__方法很相似,如果class内部出现了__str__方法优先调用__str__方法

示例一:


class Bar():
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __repr__(self):
        return f'<{self.name} is age {self.age}>'


alex = Bar('alen', 18)
print(alex)  # <alen is age 18>
class Bar():
    def __init__(self,name,age):
        self.name = name 
        self.age = age
    def __str__(self):
        return '{} is age {}'.format(self.name,self.age)
    
    def __repr__(self):
        return f'<{self.name} age is  {self.age}>'
    
alex = Bar('alen',18)
print(alex)  # alen age is 18
posted @ 2020-09-08 20:10  为了等  阅读(185)  评论(2编辑  收藏  举报