反射

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

类的一些内置函数

__str__()&__repr__()

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

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

     def __str__(self):
         return "name:{} age:{}".format(self.name, self.age)

 p1 = Person1('张三', 18)
 print(p1)  # name:张三 age:18

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

     def __repr__(self):
         return "name:{} age:{}".format(self.name, self.age)

 p2 = Person2('张三', 18)
 print(p1)  # name:张三 age:18

__del__()

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

 class A:
     def __del__(self):
         print("from del")

 a = A()
 del a  # from del

__getitem__()&__setitem__()&__delitem__()

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

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

     def __getitem__(self, item):
         print("from __getitem__:{}".format(item))
         return self.__dict__[item]

     def __setitem__(self, key, value):
         print("from __setitem__:{} = {}".format(key, value))
         self.__dict__[key] = value

     def __delitem__(self, key):
         print("from __delitem__:{}".format(key))

 p = Person('张三', 18)
 name = p['name']  # from __getitem__:name
 print(name)  # 张三

 p['age'] = 20  # from __setitem__:age = 20

 # 和@property.deleter相似 del时只是触发对应方法 并不是真的删除
 del p['age']  # from __delitem__:age
 

__new__()

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

 class Person:
     def __init__(self, name, age):
         print('from __init__()')
         self.name = name
         self.age = age

     def __new__(cls, *args, **kwargs):
         print('from __new__()')
         return object.__new__(cls)

 p = Person('张三', 18)

 # result:
 # from __new__()
 # from __init__()

__call__()

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

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

     def __call__(self, *args, **kwargs):
         print('name:{} age:{}'.format(self.name, self.age))

 p = Person('张三', 18)
 print(callable(p))  # True
 p()  # name:张三 age:18

__len__()

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

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

     def __len__(self):
         return len(self.name)

__hash__()

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

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

     def __hash__(self):
         return self.no

 p = Person(1, '张三', 18)
 

__eq__()

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

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

     def __eq__(self, other):
         return self.name == other.name

 p1 = Person('张三', 19)
 p2 = Person('张三', 18)
 print(p1 == p2)  # True

扩展

单例模式

 class Single:
     instance = None

     def __new__(cls, *args, **kwargs):
         if cls.instance:
             return cls.instance
         cls.instance = object.__new__(cls)
         return cls.instance

 o1 = Single()
 o2 = Single()
 print(o1)  # <__main__.Single object at 0x00000000021EDAC8>
 print(o2)  # <__main__.Single object at 0x00000000021EDAC8>

扑克牌

 from collections import namedtuple
 from random import choice, shuffle

 CardTuple = namedtuple('Card', ['suit', 'rank'])

 class Card:
     def __init__(self):
         suit_list = ['红桃', '黑桃', '梅花', '方块']
         rank_list = [str(i) for i in range(2, 11)] + ['J', 'Q', 'K', 'A']
         self.card_list = [CardTuple(suit, rank) for rank in rank_list for suit in suit_list]

     def __str__(self):
         return str(self.card_list)

     def __len__(self):
         return len(self.card_list)

     def __getitem__(self, item):
         return self.card_list[item]

     def __setitem__(self, key, value):
         self.card_list[key] = value

 # 一幅扑克牌
 card = Card()
 print(
     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')]
 # 扑克牌张数

 # 取第十张
 print(card[10 - 1])  # Card(suit='黑桃', rank='4')
 # 随机抽取一张
 print(choice(card))  # Card(suit='方块', rank='7')
 # 洗牌
 shuffle(card)
 print(
     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')]

对象去重

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

 p1 = Person('张三', 18)
 p2 = Person('张三', 18)
 print(set([p1, p2]))  # {<__main__.Person object at 0x000000000273DBA8>, <__main__.Person object at 0x000000000273DAC8>}

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

     def __eq__(self, other):
         return self.name == other.name and self.age == other.age

     def __hash__(self):
         return hash(self.name + str(self.age))

 p1 = Person('张三', 18)
 p2 = Person('张三', 18)
 print(set([p1, p2]))  # {<__main__.Person object at 0x0000000002702860>}

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

python基础(14)-反射&类的内置函数的更多相关文章

  1. python基础语法18 类的内置方法(魔法方法),单例模式

    类的内置方法(魔法方法): 凡是在类内部定义,以__开头__结尾的方法,都是类的内置方法,也称之为魔法方法. 类的内置方法,会在某种条件满足下自动触发. 内置方法如下: __new__: 在__ini ...

  2. python基础7之python3的内置函数

    官方介绍: python3:https://docs.python.org/3/library/functions.html?highlight=built#ascii python2:https:/ ...

  3. Python基础(二)——常用内置函数

    1. 常用内置函数 (1)isinstance(object, classinfo) 用于判断一个对象是否为某一类型. object  是实例对象 classinfo 是基本类型如 int, floa ...

  4. python面向对象的多态-类相关内置函数-类内置魔法函数-迭代器协议-上下文管理-04

    多态 一种事物具备不同的形态 例如:水 --> 固态.液态.气态 多态:# 多个不同对象可以相应同一个对象,产生不同的结果 首先强调,多态不是一种特殊的语法,而是一种状态,特性(多个不同对象可以 ...

  5. Python基础(10)_内置函数、匿名函数、递归

    一.内置函数 1.数学运算类 abs:求数值的绝对值 divmod:返回两个数值的商和余数,可用于计算页面数 >>> divmod(5,2) (2, 1) max:返回可迭代对象中的 ...

  6. python基础--迭代器、生成器、内置函数、面向对象编程

    迭代器:迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问完结束.迭代器只能往前不会后退 迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果 迭代器:迭代取值的工具 使用迭代器的 ...

  7. Python中字符串String的基本内置函数与过滤字符模块函数的基本用法

    Python中字符串String的基本内置函数与用法 首先我们要明白在python中当字符编码为:UTF-8时,中文在字符串中的占位为3个字节,其余字符为一个字节 下面就直接介绍几种python中字符 ...

  8. python基础-字符串(str)类型及内置方法

    字符串-str 用途:多用于记录描述性的内容 定义方法: # 可用'','''''',"","""""" 都可以用于定义 ...

  9. python语言(四)关键字参数、内置函数、导入第三方模块、OS模块、时间模块

    一.可变参数 定义函数时,有时候我们不确定调用的时候会传递多少个参数(不传参也可以).此时,可用包裹(packing)位置参数(*args),或者包裹关键字参数(**kwargs),来进行参数传递,会 ...

随机推荐

  1. 配置Windows 2008 R2 防火墙允许远程访问SQL Server 2008 R2

    1.先修改 sql server 2008R2的端口号吧,1433经常成为别人入侵的端口,在sql server 配置管理器 -->sql server 网络配置-->MSSQLSERVE ...

  2. C#学习笔记(34)——委托传值(回忆版)

    说明(2018-4-6 20:31:03): 1. 昨天晚上看三层,看完第一天的最后一节,会员的修改和增加,感觉欲仙欲死,果断关机睡觉. 2. 上午搞了半天哈利波特的原版书epub的下载,结果都没发现 ...

  3. opcache分享

    opcache的技术分享ppt,独家唯一经过自己实验的分享 https://pan.baidu.com/s/1-73-QHOSeet7tcR81gto6Q

  4. 【转】导致SQL执行慢的原因

    索引对大数据的查询速度的提升是非常大的,Explain可以帮你分析SQL语句是否用到相关索引. 索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本.MySQL在300万条记录左 ...

  5. 框架源码系列九:依赖注入DI、三种Bean配置方式的注册和实例化过程

    一.依赖注入DI 学习目标1)搞清楚构造参数依赖注入的过程及类2)搞清楚注解方式的属性依赖注入在哪里完成的.学习思路1)思考我们手写时是如何做的2)读 spring 源码对比看它的实现3)Spring ...

  6. STS中如何使用lombok

    Lombok有什么用使用Lombok时需要注意的点Lombok的安装spring boot集成LombokLombok常用注解@NonNull@Cleanup@Getter/@Setter@Gette ...

  7. python3 使用ldap3来作为django认证后台

    首先先使用ldap3测试ldap服务是否正常 我们先要拿到dc的数据,以及连接ldap的密码,还有搜索的字段(search_filter), 一般来说search_filter 这个是从负责ldap运 ...

  8. BarTender怎样同时打印自动日期和流水号?

    大多数条形码中都会含有日期和数量信息,而且大部分都是两者兼具.有些使用BarTender软件的小伙伴,不知道怎么同时打印自动日期和流水号,即条形码中兼有自动日期和序列号,且它们都能根据打印的变化而变化 ...

  9. python学习笔记(五)

    面向对象方法 元组的二义性:不明确参数代表的含义 circle=(2,4,6) def distance_from_origin(x,y): return "返回x,y坐标" de ...

  10. Go 用JSON加载表格数据

    支持热重载reload,但会有一些问题,下面注释有写 package table import ( "runtime/debug" ) //IntArray int类型数组 typ ...