zoukankan      html  css  js  c++  java
  • Python的特殊属性和魔法函数

    python中有很多以下划线开头和结尾的特殊属性和魔法函数,它们有着很重要的作用。

    1.__doc__:说明性文档和信息,python自建,不需要我们定义。

     1 # -*- coding:utf-8 -*-
     2 
     3 
     4 class Person:
     5     """这里是描述性信息"""
     6     def func(self):
     7         pass
     8 
     9 
    10 if __name__ == '__main__':
    11     print(Person.__doc__)

    2.__init__():实例化方法,创建实例时自动执行。

     1 # -*- coding:utf-8 -*-
     2 
     3 
     4 class Person:
     5     def __init__(self):
     6         print("自动执行了__init__()方法")
     7 
     8 
     9 
    10 if __name__ == '__main__':
    11     person = Person()

    3.__module__和__class__

    __module__:当前操作的对象属于哪一个模块,__class__:当前操作的对象属于哪一个类。

     1 # -*- coding:utf-8 -*-
     2 
     3 
     4 class Person:
     5     def __init__(self):
     6         print("自动执行了__init__()方法")
     7 
     8 
     9 if __name__ == '__main__':
    10     person = Person()
    11     print(person.__module__)
    12     print(person.__class__)
    13 
    14 
    15 -------输出--------
    16 __main__
    17 <class '__main__.Person'>

    4.__del__():当对象在内存中被释放时,自动执行该方法,该方法无限自定义,除非我们想要在对象释放时执行一些操作。

     1 # -*- coding:utf-8 -*-
     2 
     3 
     4 class Person:
     5 
     6     def __del__(self):
     7         print("我被回收了")
     8 
     9 
    10 if __name__ == '__main__':
    11     person = Person()

    5.__call__():如果一个类编写了该方法,则该类的实例后面加括号时会调用此方法。

     1 # -*- coding:utf-8 -*-
     2 
     3 
     4 class Person:
     5 
     6     def __call__(self, *args, **kwargs):
     7         print("执行了__call__")
     8 
     9 if __name__ == '__main__':
    10     person = Person()
    11     person()
    12     print(callable(Person))

    可以通过callable()函数判断一个类是否为可执行的。

    6.__dict__:列出类或者对象中的所有成员。

    # -*- coding:utf-8 -*-
    
    
    class Person:
       country = "中国"
       def __init__(self, name, age):
           self.name = name
           self.age = age
    
       def func(self):
           print("func")
    
    if __name__ == '__main__':
        print(Person.__dict__)
        person = Person("zhangsan", 19)
        print(person.__dict__)
    
    
    -------输出结果--------
    {'country': '中国', '__init__': <function Person.__init__ at 0x00000247F6218B70>, '__module__': '__main__', '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, 'func': <function Person.func at 0x00000247F6218BF8>, '__doc__': None}
    {'age': 19, 'name': 'zhangsan'}

    7.__str__():如果一个类定义了这个方法,则在打印对象时会自动执行该方法。

     1 # -*- coding:utf-8 -*-
     2 
     3 
     4 class Person:
     5 
     6     def __init__(self, name, age):
     7         self.name = name
     8         self.age = age
     9 
    10     def __str__(self):
    11         return "name:"+self.name+"----age:"+self.age
    12 
    13 if __name__ == '__main__':
    14     person = Person("zhangsan", "19")
    15     print(person)
    16 
    17 
    18 ------输出结-------
    19 name:zhangsan----age:19

     8.__getitem__(),__setitem()__.__delitem__():取数据,设置数据,删除数据。

    1 aa = 标识符[]    # 执行__getitem__()
    2 标识符[] = bb    # 执行__setitem__()
    3 del 标识符[]       # 执行__delitem__()
     1 # -*- coding:utf-8 -*-
     2 
     3 
     4 class Person:
     5     def __setitem__(self, key, value):
     6         print("执行了__setitem__()")
     7 
     8     def __getitem__(self, item):
     9         print("执行了__getitem__()")
    10 
    11     def __delitem__(self, key):
    12         print("执行了__delitem__()")
    13 
    14 
    15 if __name__ == '__main__':
    16     person = Person()
    17     r = person['a']
    18     person['a'] = "AAA"
    19     del person['a']
    20 
    21 
    22 --------输出结果-------
    23 执行了__getitem__()
    24 执行了__setitem__()
    25 执行了__delitem__()

    9.__iter__():如果想让自定义的类的对象可以被迭代,则需要定义该方法,并返回一个可迭代的对象。

     1 # -*- coding:utf-8 -*-
     2 
     3 
     4 class Person:
     5 
     6     def __iter__(self):
     7         yield 1
     8         yield 2
     9         yield 3
    10 
    11 
    12 if __name__ == '__main__':
    13     person = Person()
    14     for p in person:
    15         print(p)
    16 
    17 ------输出结果-------
    18 
    19 1
    20 2
    21 3

    10.__len__():获取对象的长度。

    In [1]: 'ABCDE'.__len__()
    Out[1]: 5
    
    In [2]: len('ABCDE')
    Out[2]: 5

    11.__repr__():返回开发可以看到的字符串,与__str__()的区别是__str__()返回用户可以看到的字符串,通常两者代码一样。

     1 # -*- coding:utf-8 -*-
     2 
     3 
     4 class Person:
     5 
     6     def __init__(self, name):
     7         self.name = name
     8 
     9     def __str__(self):
    10         return "this is %s" % self.name
    11 
    12     __repr__ = __str__
    13 
    14 
    15 if __name__ == '__main__':
    16     person = Person("张三")
    17     print(person)
    18 
    19     print(person.__repr__())
    20 
    21 
    22 ------输出结果-------
    23 this is 张三
    24 this is 张三

    12.__add__:加法,__sub__:减法,__mul__:乘法,__div__:除法,__mod__:求与运算,__pow__:幂运算

     1 class Calculator:
     2 
     3     def __init__(self, a):
     4         self.a = a
     5 
     6     def __add__(self, other):
     7         return self.a + other.a
     8 
     9 
    10 if __name__ == '__main__':
    11     a = Calculator(12)
    12     b = Calculator(22)
    13     print(a + b)

    13.__author__:表示作者信息。

     1 # -*- coding:utf-8 -*-
     2 
     3 
     4 __author__ = "boxiaoyuan"
     5 
     6 
     7 class Calculator:
     8 
     9     def show(self):
    10         print(__author__)
    11 
    12 
    13 if __name__ == '__main__':
    14     a = Calculator()
    15     a.show()

     14.__slots__:可以限制实例的变量只可以添加哪些属性。

     1 # -*- coding:utf-8 -*-
     2 
     3 def show(self):
     4     print("hello world")
     5 
     6 class Person:
     7 
     8     def __init__(self):
     9         pass
    10 
    11     __slots__ = ("name","age")
    12 
    13 
    14 p = Person()
    15 p.name = "zhangsan"
    16 p.age = "19"
    17 # p.sex = ""
    18 Person.show = show # 无法限制为类添加方法
    19 p.show()
  • 相关阅读:
    解决ecshop进入后台服务器出现500的问题
    Java8新特性(拉姆达表达式lambda)
    使用Optional优雅处理null
    Arrays.asList 存在的坑
    Java提供的几种线程池
    冒泡排序及优化详解
    如何让MySQL语句执行加速?
    关于https的五大误区
    127.0.0.1和0.0.0.0地址的区别
    宽带网络技术-大题重点
  • 原文地址:https://www.cnblogs.com/zhuzhaoli/p/10617258.html
Copyright © 2011-2022 走看看