python基础(14)-反射&类的内置函数
反射
几个反射相关的函数可参考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)-反射&类的内置函数的更多相关文章
- python基础语法18 类的内置方法(魔法方法),单例模式
类的内置方法(魔法方法): 凡是在类内部定义,以__开头__结尾的方法,都是类的内置方法,也称之为魔法方法. 类的内置方法,会在某种条件满足下自动触发. 内置方法如下: __new__: 在__ini ...
- python基础7之python3的内置函数
官方介绍: python3:https://docs.python.org/3/library/functions.html?highlight=built#ascii python2:https:/ ...
- Python基础(二)——常用内置函数
1. 常用内置函数 (1)isinstance(object, classinfo) 用于判断一个对象是否为某一类型. object 是实例对象 classinfo 是基本类型如 int, floa ...
- python面向对象的多态-类相关内置函数-类内置魔法函数-迭代器协议-上下文管理-04
多态 一种事物具备不同的形态 例如:水 --> 固态.液态.气态 多态:# 多个不同对象可以相应同一个对象,产生不同的结果 首先强调,多态不是一种特殊的语法,而是一种状态,特性(多个不同对象可以 ...
- Python基础(10)_内置函数、匿名函数、递归
一.内置函数 1.数学运算类 abs:求数值的绝对值 divmod:返回两个数值的商和余数,可用于计算页面数 >>> divmod(5,2) (2, 1) max:返回可迭代对象中的 ...
- python基础--迭代器、生成器、内置函数、面向对象编程
迭代器:迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问完结束.迭代器只能往前不会后退 迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果 迭代器:迭代取值的工具 使用迭代器的 ...
- Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
Python中字符串String的基本内置函数与用法 首先我们要明白在python中当字符编码为:UTF-8时,中文在字符串中的占位为3个字节,其余字符为一个字节 下面就直接介绍几种python中字符 ...
- python基础-字符串(str)类型及内置方法
字符串-str 用途:多用于记录描述性的内容 定义方法: # 可用'','''''',"","""""" 都可以用于定义 ...
- python语言(四)关键字参数、内置函数、导入第三方模块、OS模块、时间模块
一.可变参数 定义函数时,有时候我们不确定调用的时候会传递多少个参数(不传参也可以).此时,可用包裹(packing)位置参数(*args),或者包裹关键字参数(**kwargs),来进行参数传递,会 ...
随机推荐
- c语言搜索子字符串
c字符串功能练习: 获取一行字符串,然后,在这行字符串中搜索是否包含一个小字符串 #include <cstdio> #include <cstring> #define N ...
- SATA主机协议的FPGA实现之物理层设计
SATA主机协议的FPGA实现之物理层设计 接上一篇文章,这里讲解SATA主机协议的物理层的实现过程. 下图是标准SATA协议文档中给出的物理层结构.可以看到它包含控制模块.时钟数据提取单元.同步 ...
- 【资料下载区】【iCore系列及其它模块相关文档】更新日期2017/07/24
iCore系列双核心板原理图下载区 iCore双核心板原理图下载(注释版)iCore1s双核心板原理图下载iCore2双核心板原理图下载iCore3双核心板原理图下载iCore4双核心板原理图下载 i ...
- JavaScript鼠标拖动div且可调整div大小
http://www.softwhy.com/article-5502-1.html <!DOCTYPE html> <html> <head> <meta ...
- MA5680T OLT管理软件,全智能判断板卡,无人值守策略,根据光猫类型自动扫描添加光猫
轻量型的ONU查询工具,智能查询板卡,查询自动发现,搜索ONU等功能,需要更多智能功能,可联系QQ:561454825 下载地址:下载地址1
- minicom for Mac 配置
安装:brew install minicom 配置: 串口是:dev/tty.usbserial minicons -s 配置一下: 流控要关掉,不然输入不了
- 2. ansible-playbook 条件语句-内部变量使用
内部变量指的是把变量定义在playbook里面或者是执行结果作为变量 循环语句-标准Loops [root@LeoDevops playb]# cat p_loop.yaml - hosts: u12 ...
- git和github新手快速操作流程
git和github新手快速操作流程 本文主要介绍利用git版本控制将项目托管到远程仓库github上的一般性操作流程,为了给正在学习git的同学们一个小小的参考,以便更轻松的去深入学习git,本文所 ...
- unity 5.3 以后加载场景
记录下官方建议的加载场景的方法: StartCoroutine(LoadYourAsyncScene()); IEnumerator LoadYourAsyncScene() { // The App ...
- 使用Lifecycle管理Tomcat中组件的生命周期
大型软件和汽车制造工厂一样,组件繁多,关系复杂,相互协同完成了汽车的生产过程.软件中的Object就像是工厂中component一样. 下面来看看相关的类和接口: abstract class Lif ...