反射

几个反射相关的函数可参考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. Atitit s2018 s4 doc list dvchomepc dvccompc.docx .docx \s2018 s4 doc compc dtS44 \s2018 s4 doc dvcCompc dtS420 \s2018 s4f doc homepc \s2018 s4 doc compc dtS44\(5 封私信 _ 44 条消息)WebSocket 有没有可能取代 AJAX

    Atitit s2018 s4 doc list dvchomepc dvccompc.docx .docx \s2018 s4 doc compc dtS44 \s2018 s4 doc dvcCo ...

  2. Atitti 互联网时代三大竞争战略 ——平台化战略 锚”战略、价值领先战略

    Atitti 互联网时代三大竞争战略 ——平台化战略 锚”战略.价值领先战略 美国著名管理学家迈克尔•波特在<竞争战略>一书中提出了集中化战略和差异化战略.成本领先战略三种基本竞争战略,从 ...

  3. Python3 字符串前面加u,r,b的含义

    u/U:表示unicode字符串 不是仅仅是针对中文, 可以针对任何的字符串,代表是对字符串进行unicode编码. 一般英文字符在使用各种编码下, 基本都可以正常解析, 所以一般不带u:但是中文, ...

  4. python按行遍历一个大文件,最优的语法应该是什么?

    理论上来说,总体上file.readlines()可以(取决于实现)不慢于你自己手动的一次次调用file.readline(),因为前者的循环在C语言层面,而你的循环是在Python语言层面. 但是在 ...

  5. hdoj:2051

    #include <iostream> #include <string> #include <vector> #include <algorithm> ...

  6. Android 查看蓝牙hci日志

    最近在调试android连接ble设备,需要查看hci日志.记录一下方法. 1. 开发者选项->启用蓝牙HCI信息收集日志. 2. android 8版本,默认位置/data/misc/blue ...

  7. TCP是如何保证可靠传输的

    TCP 协议如何保证可靠传输   一.综述 1.确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传. 2.数据校验 3.数据合理分片和排序: UDP:IP数据报大于1500字节 ...

  8. Scikit-learn使用总结

    在机器学习和数据挖掘的应用中,scikit-learn是一个功能强大的python包.在数据量不是过大的情况下,可以解决大部分问题.学习使用scikit-learn的过程中,我自己也在补充着机器学习和 ...

  9. Python Pandas 箱线图

    各国家用户消费分布 import numpy as np import pandas as pd import matplotlib.pyplot as plt data = { 'China': [ ...

  10. L - Father Christmas flymouse

    来源poj3160 After retirement as contestant from WHU ACM Team, flymouse volunteered to do the odds and ...