当前位置: 首页 > news >正文

python基础(14)-反射类的内置函数

反射

几个反射相关的函数可参考python基础(10)-匿名函数&内置函数中2.2.4反射相关

类的一些内置函数

__str__()&__repr__()

重写__str__()函数类似重写java中的toString()函数.当没有重写__str__()但重写了__repr__()函数时,__repr__()函数会充当一个__str__函数的替代函数执行

 1 class Person1:
 2     def __init__(self, name, age):
 3         self.name = name
 4         self.age = age
 5 
 6     def __str__(self):
 7         return "name:{} age:{}".format(self.name, self.age)
 8 
 9 
10 p1 = Person1('张三', 18)
11 print(p1)  # name:张三 age:18
12 
13 
14 class Person2:
15     def __init__(self, name, age):
16         self.name = name
17         self.age = age
18 
19     def __repr__(self):
20         return "name:{} age:{}".format(self.name, self.age)
21 
22 p2 = Person2('张三', 18)
23 print(p1)  # name:张三 age:18
View Code

__del__()

销毁一个对象的时候执行,类似java中的析构函数

1 class A:
2     def __del__(self):
3         print("from del")
4 
5 a = A()
6 del a  # from del
View Code

__getitem__()&__setitem__()&__delitem__()

以'[]'的形式访问属性

 1 class Person:
 2     def __init__(self, name, age):
 3         self.name = name
 4         self.age = age
 5 
 6     def __getitem__(self, item):
 7         print("from __getitem__:{}".format(item))
 8         return self.__dict__[item]
 9 
10     def __setitem__(self, key, value):
11         print("from __setitem__:{} = {}".format(key, value))
12         self.__dict__[key] = value
13 
14     def __delitem__(self, key):
15         print("from __delitem__:{}".format(key))
16 
17 
18 p = Person('张三', 18)
19 name = p['name']  # from __getitem__:name
20 print(name)  # 张三
21 print(p.age)  # 18
22 p['age'] = 20  # from __setitem__:age = 20
23 print(p.age)  # 20
24 # 和@property.deleter相似 del时只是触发对应方法 并不是真的删除
25 del p['age']  # from __delitem__:age
26 print(p.age)  # 20
View Code

__new__()

创建对象(self),类似java中的构造函数,在__init__()函数之前执行

 1 class Person:
 2     def __init__(self, name, age):
 3         print('from __init__()')
 4         self.name = name
 5         self.age = age
 6 
 7     def __new__(cls, *args, **kwargs):
 8         print('from __new__()')
 9         return object.__new__(cls)
10 
11 p = Person('张三', 18)
12 
13 # result:
14 # from __new__()
15 # from __init__()
View Code

__call__()

让一个类的实例成为一个callable对象

 1 class Person:
 2     def __init__(self, name, age):
 3         self.name = name
 4         self.age = age
 5 
 6     def __call__(self, *args, **kwargs):
 7         print('name:{} age:{}'.format(self.name, self.age))
 8 
 9 p = Person('张三', 18)
10 print(callable(p))  # True
11 p()  # name:张三 age:18
View Code

__len__()

对len()函数传入一个对象实际上就是调用这个对象的__len__()函数

 1 class Person:
 2     def __init__(self, name, age):
 3         self.name = name
 4         self.age = age
 5 
 6     def __len__(self):
 7         return len(self.name)
 8 
 9 
10 print(len(Person('张三', 18)))  # 2
View Code

__hash__()

对hash()函数传入一个对象实际上就是调用这个对象的__hash__()函数

 1 class Person:
 2     def __init__(self, no, name, age):
 3         self.no = no
 4         self.name = name
 5         self.age = age
 6 
 7     def __hash__(self):
 8         return self.no
 9 
10 
11 p = Person(1, '张三', 18)
12 print(hash(p))  # 1
View Code

__eq__()

使用'=='判断两个对象是否相等时,依据__eq__()函数返回的值.类似java中的equals()函数

 1 class Person:
 2     def __init__(self, name, age):
 3         self.name = name
 4         self.age = age
 5 
 6     def __eq__(self, other):
 7         return self.name == other.name
 8 
 9 
10 p1 = Person('张三', 19)
11 p2 = Person('张三', 18)
12 print(p1 == p2)  # True
View Code

扩展

单例模式

 1 class Single:
 2     instance = None
 3 
 4     def __new__(cls, *args, **kwargs):
 5         if cls.instance:
 6             return cls.instance
 7         cls.instance = object.__new__(cls)
 8         return cls.instance
 9 
10 o1 = Single()
11 o2 = Single()
12 print(o1)  # <__main__.Single object at 0x00000000021EDAC8>
13 print(o2)  # <__main__.Single object at 0x00000000021EDAC8>
View Code

扑克牌

 1 from collections import namedtuple
 2 from random import choice, shuffle
 3 
 4 CardTuple = namedtuple('Card', ['suit', 'rank'])
 5 
 6 
 7 class Card:
 8     def __init__(self):
 9         suit_list = ['红桃', '黑桃', '梅花', '方块']
10         rank_list = [str(i) for i in range(2, 11)] + ['J', 'Q', 'K', 'A']
11         self.card_list = [CardTuple(suit, rank) for rank in rank_list for suit in suit_list]
12 
13     def __str__(self):
14         return str(self.card_list)
15 
16     def __len__(self):
17         return len(self.card_list)
18 
19     def __getitem__(self, item):
20         return self.card_list[item]
21 
22     def __setitem__(self, key, value):
23         self.card_list[key] = value
24 
25 
26 # 一幅扑克牌
27 card = Card()
28 print(
29     card)  # [Card(suit='红桃', rank='2'), Card(suit='黑桃', rank='2'), Card(suit='梅花', rank='2'), Card(suit='方块', rank='2'), Card(suit='红桃', rank='3'), Card(suit='黑桃', rank='3'), Card(suit='梅花', rank='3'), Card(suit='方块', rank='3'), Card(suit='红桃', rank='4'), Card(suit='黑桃', rank='4'), Card(suit='梅花', rank='4'), Card(suit='方块', rank='4'), Card(suit='红桃', rank='5'), Card(suit='黑桃', rank='5'), Card(suit='梅花', rank='5'), Card(suit='方块', rank='5'), Card(suit='红桃', rank='6'), Card(suit='黑桃', rank='6'), Card(suit='梅花', rank='6'), Card(suit='方块', rank='6'), Card(suit='红桃', rank='7'), Card(suit='黑桃', rank='7'), Card(suit='梅花', rank='7'), Card(suit='方块', rank='7'), Card(suit='红桃', rank='8'), Card(suit='黑桃', rank='8'), Card(suit='梅花', rank='8'), Card(suit='方块', rank='8'), Card(suit='红桃', rank='9'), Card(suit='黑桃', rank='9'), Card(suit='梅花', rank='9'), Card(suit='方块', rank='9'), Card(suit='红桃', rank='10'), Card(suit='黑桃', rank='10'), Card(suit='梅花', rank='10'), Card(suit='方块', rank='10'), Card(suit='红桃', rank='J'), Card(suit='黑桃', rank='J'), Card(suit='梅花', rank='J'), Card(suit='方块', rank='J'), Card(suit='红桃', rank='Q'), Card(suit='黑桃', rank='Q'), Card(suit='梅花', rank='Q'), Card(suit='方块', rank='Q'), Card(suit='红桃', rank='K'), Card(suit='黑桃', rank='K'), Card(suit='梅花', rank='K'), Card(suit='方块', rank='K'), Card(suit='红桃', rank='A'), Card(suit='黑桃', rank='A'), Card(suit='梅花', rank='A'), Card(suit='方块', rank='A')]
30 # 扑克牌张数
31 print(len(card))  # 52
32 # 取第十张
33 print(card[10 - 1])  # Card(suit='黑桃', rank='4')
34 # 随机抽取一张
35 print(choice(card))  # Card(suit='方块', rank='7')
36 # 洗牌
37 shuffle(card)
38 print(
39     card)  # [Card(suit='黑桃', rank='8'), Card(suit='梅花', rank='6'), Card(suit='黑桃', rank='2'), Card(suit='红桃', rank='4'), Card(suit='梅花', rank='4'), Card(suit='红桃', rank='K'), Card(suit='方块', rank='9'), Card(suit='梅花', rank='7'), Card(suit='梅花', rank='9'), Card(suit='方块', rank='4'), Card(suit='红桃', rank='7'), Card(suit='黑桃', rank='J'), Card(suit='红桃', rank='8'), Card(suit='梅花', rank='K'), Card(suit='红桃', rank='J'), Card(suit='黑桃', rank='6'), Card(suit='红桃', rank='A'), Card(suit='红桃', rank='10'), Card(suit='梅花', rank='5'), Card(suit='方块', rank='6'), Card(suit='方块', rank='10'), Card(suit='方块', rank='8'), Card(suit='方块', rank='7'), Card(suit='黑桃', rank='Q'), Card(suit='方块', rank='A'), Card(suit='红桃', rank='6'), Card(suit='梅花', rank='8'), Card(suit='梅花', rank='J'), Card(suit='梅花', rank='3'), Card(suit='方块', rank='J'), Card(suit='方块', rank='5'), Card(suit='梅花', rank='2'), Card(suit='黑桃', rank='4'), Card(suit='梅花', rank='A'), Card(suit='黑桃', rank='3'), Card(suit='黑桃', rank='5'), Card(suit='方块', rank='K'), Card(suit='红桃', rank='Q'), Card(suit='方块', rank='3'), Card(suit='方块', rank='2'), Card(suit='黑桃', rank='A'), Card(suit='黑桃', rank='7'), Card(suit='方块', rank='Q'), Card(suit='黑桃', rank='9'), Card(suit='红桃', rank='2'), Card(suit='红桃', rank='9'), Card(suit='黑桃', rank='10'), Card(suit='梅花', rank='10'), Card(suit='红桃', rank='3'), Card(suit='红桃', rank='5'), Card(suit='黑桃', rank='K'), Card(suit='梅花', rank='Q')]
View Code

对象去重

 1 class Person:
 2     def __init__(self, name, age):
 3         self.name = name
 4         self.age = age
 5 
 6 
 7 p1 = Person('张三', 18)
 8 p2 = Person('张三', 18)
 9 print(set([p1, p2]))  # {<__main__.Person object at 0x000000000273DBA8>, <__main__.Person object at 0x000000000273DAC8>}
10 
11 
12 class Person:
13     def __init__(self, name, age):
14         self.name = name
15         self.age = age
16 
17     def __eq__(self, other):
18         return self.name == other.name and self.age == other.age
19 
20     def __hash__(self):
21         return hash(self.name + str(self.age))
22 
23 
24 p1 = Person('张三', 18)
25 p2 = Person('张三', 18)
26 print(set([p1, p2]))  # {<__main__.Person object at 0x0000000002702860>}
View Code

结论:使用set()给对象的去重是同时依赖对象的__hash__()和__eq__()函数的

转载于:https://www.cnblogs.com/zze46/p/9582899.html

相关文章:

  • 「模板」 FHQ_Treap
  • Centos7安装Oracle12c
  • C#下载文件,Stream 和 byte[] 之间的转换
  • 机器学习十一-特征选择与稀疏学习
  • LoadRunner11录制时不能弹出IE浏览器
  • Swift4.0复习访问控制与作用域
  • nginx代理PHP获取IP 的问题
  • git-命令使用
  • C#解析Json
  • Integer值判断是否相等问题
  • EntityFramework Core 2.0 Explicitly Compiled Query(显式编译查询)
  • C语言数组的概念
  • shell中获取当前目录
  • kali使用Fluxion钓鱼WiFi
  • python url中文转码
  • 30天自制操作系统-2
  • create-react-app做的留言板
  • Github访问慢解决办法
  • Less 日常用法
  • oschina
  • Python学习之路16-使用API
  • vue-cli3搭建项目
  • windows-nginx-https-本地配置
  • 从零开始的无人驾驶 1
  • 大型网站性能监测、分析与优化常见问题QA
  • 读懂package.json -- 依赖管理
  • 开源地图数据可视化库——mapnik
  • 面试遇到的一些题
  • 那些年我们用过的显示性能指标
  • 七牛云假注销小指南
  • 前端设计模式
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 微信小程序填坑清单
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • ​决定德拉瓦州地区版图的关键历史事件
  • # 计算机视觉入门
  • #{}和${}的区别是什么 -- java面试
  • #每天一道面试题# 什么是MySQL的回表查询
  • (9)STL算法之逆转旋转
  • (LeetCode) T14. Longest Common Prefix
  • (Python第六天)文件处理
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (转)mysql使用Navicat 导出和导入数据库
  • . Flume面试题
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .net framework profiles /.net framework 配置
  • .NET 解决重复提交问题
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .Net多线程总结