当前位置:   article > 正文

python中魔法方法_self.key

self.key

一、魔法方法:

                   在python中 有一些方法以两个下划线开头和结尾,这些方法会在合适的时机进行调用(解释器自行调用),我们把这一类方法称为魔法方法。

二、类中常用的魔法方法:

  1. '''
  2. __new__()、__init__()、__del__()、__str__()、__repr__()
  3. __setattr__、__getattr__、__delattr__、__getattribute__
  4. __eq__、__ne__、__lt__、__gt__
  5. '''
  6. class Person(object):
  7. def __new__(cls,*args,**kwargs):
  8. '''
  9. 1.该方法 为实例化对象时候第一个调用的方法,
  10. 2.该方法 的返回值为对象实例则 调用构造方法__init__(),否则不调用构造方法
  11. '''
  12. print("__new__ 方法被调用...")
  13. return super().__new__(cls) #这里通过父类的 __new__方法 返回对象实例,因此这里会调用构造方法
  14. def __init__(self,name,age):
  15. '''
  16. 该方法 用于构造对象,对象初始化
  17. '''
  18. self.name = name
  19. self.age = age
  20. print("__init__ 方法被调用...")
  21. def __del__(self):
  22. '''
  23. 该方法 在销毁对象时候自动被调用
  24. '''
  25. print("__del__ 方法被调用...")
  26. def __str__(self):
  27. '''
  28. 该方法 用于显示对象信息,当调用print 打印该对象时候,会调用该方法
  29. '''
  30. return "我叫:" + self.name + ", 今年" + str(self.age) + "岁了."
  31. def __repr__(self):
  32. '''
  33. 该方法 用于显示对象信息,当调用print 打印该对象时候,会调用该方法,区别在于
  34. 该方法是 给解释器 看的,__str__ 是给 人看的
  35. 当重写 __str__ 后,print 打印对象 将 不会 调用 __repr__ 一般这样写:
  36. 重写 __str__ 后 __repr__ = __str__
  37. '''
  38. return "我叫:" + self.name + ", 今年" + str(self.age) + "岁了."
  39. def __bool__(self):
  40. '''
  41. 该方法 调用 bool 时候 会自动调用:对象.bool
  42. '''
  43. return Ture if self.age > 18 False
  44. def __setattr__(self,key,value):
  45. '''
  46. 该方法为 父类方法: 当属性被设置时候 自动调用
  47. '''
  48. if key not in ("name","age"):
  49. return
  50. if key == "age" and value < 0:
  51. return ValueError()
  52. super(Person,self).__setattr__(key,value)
  53. def __getattr__(self,key):
  54. '''
  55. 访问某个不存在的属性 调用
  56. '''
  57. return "not exit"
  58. def __delattr__(self,key):
  59. '''
  60. 删除某个属性时候调用
  61. '''
  62. if key == "name":
  63. raise AttributeError()
  64. super().__delattr__(key)
  65. def __getattribute__(self,key):
  66. '''
  67. 所有属性/方法调用都经过这里,属于类方法
  68. '''
  69. return super().__getattribute__(key)
  70. def __eq__(self,other):
  71. '''
  72. 用于比较两个对象的是否相等 p1 == p2
  73. '''
  74. return self.name = other.name
  75. def __ne__(self,other):
  76. '''
  77. 用于比较两个对象是否不等
  78. '''
  79. return self.age != other.age
  80. def __lt__(self,other):
  81. '''
  82. 小于
  83. '''
  84. return self.age < other.age
  85. def __gt__(self,other):
  86. '''
  87. 大于
  88. '''
  89. return self.age > other.age

三、容器中常用魔法方法

  1. '''
  2. __setitem__、__getitem__、__delitem__、__len__、__iter__、__contains__、__reversed__
  3. '''
  4. class MyDict(object):
  5. '''
  6. 使用列表模拟 字典数据结构
  7. '''
  8. def __init__(self):
  9. self.__keys = []
  10. self.__values = []
  11. self.__pos = 0
  12. def __setitem__(self,key,value):
  13. '''
  14. 设置容器中元素的行为
  15. '''
  16. if key in self.keys:
  17. self.__values[self.keys.index(key)] = value
  18. else:
  19. self.__keys.append(key)
  20. self.__values.append(value)
  21. def __getitem__(self,key):
  22. '''
  23. 获取元素行为
  24. '''
  25. if key in self.keys:
  26. return self.__keys[self.__keys.index(key)],self.__values[self.__keys.index(key)]
  27. def __len__(self):
  28. '''
  29. 容器的长度
  30. '''
  31. return len(self.__keys)
  32. def __contains__(self,key):
  33. '''
  34. 容器成员运算
  35. '''
  36. return key in self.__keys
  37. def __reversed__(self):
  38. '''
  39. 容器翻转
  40. '''
  41. self.__keys.reverse()
  42. self.__values.reverse()
  43. def __iter__(self):
  44. '''
  45. 遍历容器时候使用
  46. '''
  47. return self
  48. def __next__(self):
  49. '''
  50. 遍历容器时候 __iter__ 返回值为 self 则要重写 __next__ 方法
  51. 返回值为 iter(obj) obj为内置对象,则使用obj 对象的__next__ 方法
  52. '''
  53. if self.__pos > len(self.__keys) - 1:
  54. raise StopIterIteration()
  55. key = self.__keys[self.__pos]
  56. value = self.__values[self.__keys.index(key)]
  57. return key,value
  58. def __delitem__(self,key):
  59. '''
  60. 删除 容器元素 时调用
  61. '''
  62. if key in self.__keys:
  63. del self.__values[self.__keys.index(key)]
  64. del self.__keys[self.__keys.index(key)]

四、可调用的对象

  1. '''
  2. __call__
  3. '''
  4. class Person(object):
  5. def __init__(self,name,age):
  6. self.name = name
  7. self.age = age
  8. def __call__(self,name,age):
  9. self.name = name
  10. self.age = age
  11. if __name__ == "__main__":
  12. p = Person("zhangsan",18)
  13. p("lisi",20) # 这里调用 __call__ 方法

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/756661
推荐阅读
相关标签
  

闽ICP备14008679号