Python的魔术方法总结
魔术方法:再不需要程序员定义,本身就存在类中的方法就是魔术方法。
魔术方法通常都长这样:__名字__。
1.__str__和__repr__
为了方便记忆看如下列子
class Course:
def __init__(self,name,period,price,teacher):
self.name= name
self.period = period
self.price = price
self.teacher = teacher def __str__(self):
return 'str : %s %s %s %s' % (self.name, self.period, self.price, self.teacher) def __repr__(self):
return 'repr : %s %s %s %s' % (self.name, self.period, self.price, self.teacher)
course_lst = []
python = Course('python','6 month',29800,'boss jin')
course_lst.append(python)
linux = Course('linux','5 month',25800,'oldboy')
course_lst.append(linux)
for id,course in enumerate(course_lst,1):
# print('%s %s %s %s %s'%(id,course.name,course.period,course.price,course.teacher))
print(id,course)
print('%s %s'%(id,course))
print(str(course))
print(repr(course))
print('%r'%course)
__str__,__repr__
__str__触发条件:
1.当你打印一个对象的时候触发
2.当你使用%格式化的时候触发
3.str强转数据类型的时候触发
__repr__:
1.__repr__是__str__的备胎
2.有__str__的时候执行__str__,没有实现__str__的时候,执行__repr__
3.repr(obj)内置函数对应的结果是__repr__的返回值
4.当你使用%r的格式化的时候 触发__repr__
2.__new__
在init之前,实例化对象的第一步是__new__创建了一个空间
class Foo:
def __init__(self): # 初始化方法
print('执行了init') def __new__(cls, *args, **kwargs): # 构造方法
# object.__new__(cls)
print('执行了new')
return object.__new__(cls) obj = Foo()
创造一个对象比喻成捏小人
new是把小人捏出来
init给小人穿衣服
应用:创建单例模式
class Foo:
__instance = None def __init__(self, name, age): # 初始化方法
self.name = name
self.age = age
self.lst = [name] def __new__(cls, *args, **kwargs): # 构造方法
if cls.__instance is None:
cls.__instance = object.__new__(cls)
return cls.__instance obj1 = Foo('alex', 20)
obj2 = Foo('egon', 22)
abc1 = Foo('cao', 33)
print(obj1.lst, obj2.lst, abc1.lst)
单列模式
3.__del__
对象的__del__是对象在被gc消除回收的时候起作用的一个方法,它的执行一般也就意味着对象不能够继续引用。
看如下列子:
class Foo:
def __init__(self, name, age):
self.name = name
self.age = age
self.file = open('file', mode='w') def write(self):
self.file.write('sjahgkldhgl') def __del__(self): # 析构方法 : 在删除这个类创建的对象的时候会先触发这个方法,再删除对象
# 做一些清理工作,比如说关闭文件,关闭网络的链接,数据库的链接
self.file.close()
print('执行del了') f = Foo('alex', 20)
print(f)
__del__
4.__len__
如果一个类表现得像一个list,要获取有多少个元素,就得用 len() 函数。
要让 len() 函数工作正常,类必须提供一个特殊方法__len__(),它返回元素的个数。
class A:
def __init__(self):
self.a = 1
self.b = 2
def __len__(self):
return len(self.__dict__)
a = A()
print(len(a))
print(a.__dict__)
菲波那切数列
# 菲波那切数列
# class Fib(object):
# def __init__(self, num):
# a, b, L = 0, 1, []
# for n in range(num):
# L.append(a)
# a, b = b, a + b
# self.numbers = L
#
# def __str__(self):
# return str(self.numbers)
#
# # __repr__ = __str__
#
# def __len__(self):
# return len(self.numbers)
#
#
# f = Fib(10)
# print(f)
# print(len(f))
菲波那切数列
5.__eq__
__eq__ 当判断两个对象的值是否相等时,触发此方法.
class Staff:
def __init__(self,name,sex):
self.name = name
self.sex = sex
def __eq__(self, other):
return self.__dict__ == other.__dict__
alex = Staff('alex','不详')
alex2 = Staff('alex','不详')
alex22 = Staff('alex2','female')
print(alex == alex2) # alex.__eq__(alex2)
print(alex2 == alex22)
6.__call__
对象后面加括号,触发执行。
class Foo:
def __init__(self):
pass
def __call__(self, *args, **kwargs):
print('__call__')
obj = Foo() # 执行 __init__
obj() # 执行 __call__
7.__hash__
# 当一个对象的类中有"__hash__"这个方法时, 那么这个对象就可以执哈希计算
# 前提是要哈希的值是可哈希的. 哈希的不是对象, 而是可以通过对象直接执行"hash(obj)"
class A:
def __init__(self):
self.a = 1
self.b = 2 def __hash__(self):
return hash(str(self.a)+str(self.b))
a = A()
print(hash(a))
8.item系列
__getitem__,__setitem,__delitem__
class Foo:
def __init__(self,name):
self.name=name def __getitem__(self, item):
print(self.__dict__[item]) def __setitem__(self, key, value):
self.__dict__[key]=value
def __delitem__(self, key):
print('del obj[key]时,我执行')
self.__dict__.pop(key)
def __delattr__(self, item):
print('del obj.key时,我执行')
self.__dict__.pop(item) f1=Foo('sb')
f1['age']=18
f1['age1']=19
del f1.age1
del f1['age']
f1['name']='alex'
print(f1.__dict__)
item系列
Python的魔术方法总结的更多相关文章
- python的魔术方法大全
在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”(魔术方法),例如类的初始化方法 __init__ ,Python中所有的魔术方法均在官方文档中有相应描述,这 ...
- python常用魔术方法概览
构造和初始化 __init__(self, args) 构造函数 __new__(cls) 传入的是类实例 __del__(self) 析构函数,调用 del cls 时会被调用 属性访问控制 __g ...
- python的魔术方法
什么叫魔术方法: 在python中定义以双下划线开头,有一些python自定义的函数,并且以双下划线为结尾的函数叫做魔法函数 class Company(object): def __init__(s ...
- Python的魔术方法详解
构造和初始化 __init__我们很熟悉了,它在对象初始化的时候调用,我们一般将它理解为"构造函数". 实际上, 当我们调用x = SomeClass()的时候调用,__init_ ...
- python面向对象魔术方法补充
一.描述符 在 面向对象 编程中 定义一个(没有定义方法)类:class person , 在这个类里面,有name,age, heigth, weight,等等属性, 这个类就可以看作一个对 per ...
- Python魔术方法-Magic Method
介绍 在Python中,所有以"__"双下划线包起来的方法,都统称为"Magic Method",例如类的初始化方法 __init__ ,Python中所有的魔 ...
- Python 魔术方法指南
入门 构造和初始化 构造定制类 用于比较的魔术方法 用于数值处理的魔术方法 表现你的类 控制属性访问 创建定制序列 反射 可以调用的对象 会话管理器 创建描述器对象 持久化对象 总结 附录 介绍 此教 ...
- Python 类的魔术方法
Python中类的魔术方法 在Python中以两个下划线开头的方法,__init__.__str__.__doc__.__new__等,被称为"魔术方法"(Magic method ...
- Python中的魔术方法详解
介绍 在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”,中文称『魔术方法』,例如类的初始化方法 __init__ ,Python中所有的魔术方法均在官方文档中 ...
随机推荐
- Excel 如何判断某列哪些单元格包含某些字符
“条件格式”,公式: =IF(COUNTIF($A2,,,) 然后根据需要设置格式
- day 05
今天学习了数据类型的操作 首先需要知道 数据类型有哪些 1.数字类型 2.字符串类型 3.布尔类型 4.列表类型 5.字典类型 6.元组类型 7.集合类型类型 1.1数字类型里面有分 为整型(int) ...
- MySQL触发器在建立时,报语法错的问题
delimiter $$ create trigger trg_delete_on_users before DELETE on users for each row begin delete fro ...
- svg---基础1
svg:可缩放矢量图形是基于可扩展标记语言(标准通用标记语言的子集),用于描述二维矢量图形的一种图形格式.它由万维网制定,是一个开放标准. 官网:http://www.w3.org/2000/svg ...
- 关于javaweb项目红叉报错可但项目可以正常运行的解决办法
有时候导入的项目工程,文件夹左下角永远有一个红叉,但是由于不影响程序运行,所以之前一直忽略了,但是强迫症患者表示不解决巨蓝瘦,网上有些方法没有讲清楚,所以今天做了个总结来教大家如何详细解 ...
- 关于SQL优化的一点建议
前段时间一直在做关于性能优化相关的工作,结合自己的实际工作经验,只针对SQL层面提一些优化的规范和建议. 针对SQL编写 1.单条SQL长度不宜超过100行: 2.SQL子查询不宜嵌套3层: 子查询嵌 ...
- SKCTF Writeup
签到题 请打开微信关注,发送give me flag,即可获得. Encode 1.ACSCLL 首先看到这类题,我们肯定是要使用ASCLL的(这么明显的提示大家肯定一眼就能看出来),我们可以对照As ...
- linux下的缓存机制及清理buffer/cache/swap的方法梳理 (转)
一.缓存机制介绍 在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果 ...
- Mybatis Generator代码自动生成(实体类、dao层、映射文件)
写了一段时间增删改查有点厌烦,自己找了下网上的例子鼓捣了下自动生成. 首先得有一个配置文件: generatorConfig.xml <?xml version="1.0" ...
- Haystack
什么是Haystack Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),该框架支持Solr,Elasticsearch,Whoosh, ...