Python魔法函数(特殊函数) Python中如何实现运算符python特殊化函数的重载python特殊化函数,即实现例如a b这样python特殊化函数的运算符操作呢python特殊化函数?
在C中可以使用 operator 关键字实现运算符的重载 。但是在Python中没有类似这样的关键字python特殊化函数,所以要实现运算符的重载,就要用到Python的魔法函数 。Python魔法函数是以双下划线开头,双下划线结尾的一组函数 。我们在类定义中最常用到的 __init__ 函数就是这样一个魔法函数 , 它在创建类对象时被自动调用 。
下面我们来看个简单的例子 。
上述代码示例了几个魔法函数的用法 。__add__函数对应了二元运算符,当执行a b语句时 , python就会自动调用a.add(b) 。对于上述例子中的v1 v2 v3,则相当于调用了(v1.add(v2)).add(v3) 。
代码中还有一个在Python类定义经常使用的__str__函数,当使用str()时会被调用 。print函数对传入的参数都调用了str()将其转换成易读的字符串形式,便于打印输出,因而会调用类定义的__str__函数打出自定义的字符串 。
代码中还有一个特殊的__call__函数 , 该函数在将对象采用函数调用方式使用时被调用, 例如v1()相当于v1.call() 。
以上就是魔法函数的基本使用方法 。常见的魔法函数我们可以使用dir()函数来查看 。
输出结果为:
上述结果中形式为‘__函数名__’的函数为魔法函数,注意有些对象也是这种形式 , 例如__class__, __module__等, 这些不是魔法函数 。具体的魔法函数说明可以参考Python官方说明文档 。
以上代码在Python3.6运行通过.
详解Python中的__new__、__init__、__call__三个特殊方法 __new__: 对象的创建,是一个静态方法,第一个参数是cls 。(想想也是,不可能是self,对象还没创建 , 哪来的self)
__init__ : 对象的初始化,是一个实例方法,第一个参数是self 。
__call__ : 对象可call , 注意不是类 , 是对象 。
先有创建,才有初始化 。即先__new__,而后__init__ 。
上面说的不好理解,看例子 。
1.对于__new__
可以看到,输出来是一个Bar对象 。
__new__方法在类定义中不是必须写的 , 如果没定义,默认会调用object.__new__去创建一个对象 。如果定义了,就是override,可以custom创建对象的行为 。
聪明的读者可能想到,既然__new__可以custom对象的创建,那我在这里做一下手脚 , 每次创建对象都返回同一个,那不就是单例模式了吗?没错,就是这样 。可以观摩《飘逸的python - 单例模式乱弹》
定义单例模式时,因为自定义的__new__重载了父类的__new__,所以要自己显式调用父类的__new__,即object.__new__(cls, *args, **kwargs),或者用super() 。,不然就不是extend原来的实例了,而是替换原来的实例 。
2.对于__init__
【python特殊化函数 python 特殊变量】 使用Python写过面向对象的代码的同学 , 可能对 __init__ 方法已经非常熟悉了 , __init__ 方法通常用在初始化一个类实例的时候 。例如:
这样便是__init__最普通的用法了 。但__init__其实不是实例化一个类的时候第一个被调用 的方法 。当使用 Persion(name, age) 这样的表达式来实例化一个类时,最先被调用的方法 其实是 __new__ 方法 。
3.对于__call__
对象通过提供__call__(slef, [,*args [,**kwargs]])方法可以模拟函数的行为,如果一个对象x提供了该方法,就可以像函数一样使用它,也就是说x(arg1, arg2...) 等同于调用x.__call__(self, arg1, arg2)。模拟函数的对象可以用于创建防函数(functor) 或代理(proxy).
总结,在Python中,类的行为就是这样,__new__、__init__、__call__等方法不是必须写的,会默认调用,如果自己定义了 , 就是override,可以custom 。既然override了 , 通常也会显式调用进行补偿以达到extend的目的 。
这也是为什么会出现"明明定义def _init__(self, *args, **kwargs),对象怎么不进行初始化"这种看起来诡异的行为 。(注,这里_init__少写了个下划线,因为__init__不是必须写的,所以这里不会报错 , 而是当做一个新的方法_init__)
Python中处理属性的重要属性和函数是什么处理属性的重要属性和函数
1、特殊属性
__class__:对象所属类的引用(即obj.__class__和type(obj)的作用相同) 。Python中的某些特殊方法比如 __getattr__,只在对象的类中寻找,而不在实例中寻找 。__dict__:一个映射,存储对象或类的可写属性 。__slots__:类可以定义这个属性,限制实例有哪些属性 。
2、内置函数
dir([object]):列出对象的大多数属性 。getattr(object,name[,default]):从object对象中获取name字符串对应的属性 。获取的属性可能来自对象所属的类或超类 。hasattr(object,name):若object对象中存在指定的属性 , 或者能以某种方式(如继承)通过object对象获取指定的属性 , 返回True 。setattr(object,name,value):把object对象指定属性的值设为value,前提是object对象能接受那个值 。这个函数可能会创建一个新属性,或者覆盖现有的属性 。var([object]):返回object对象的__dict__属性 。
相关推荐:《Python视频教程》
3、特殊方法
__delattr__(self,name):只要使用del语句删除属性,就会调用这个方法 。__dir__(self):把对象传给dir函数时调用,列出属性 。__getattr__(self,name):仅当获取指定的属性失败 , 搜索过obj , Class和超类之后调用 。__getattribute__(self,name):尝试获取指定的属性时总会调用这个方法 。不过寻找的属性是特殊属性或特殊方法时除外 。为了防止无限递归 , __getattribute__方法的实现要使用super().__getattribute__(obj,name) 。__setattr__(self,name,value):尝试设置指定的属性时总会调用这个方法 。点号和setattr内置函数会触发这个方法 。
相关推荐:
Python中的属性和特性是什么
python函数和方法区别python中函数和方法python特殊化函数的区别:
首先python特殊化函数,从分类的角度来分析 。
(1)函数的分类:
内置函数:python内嵌的一些函数 。
匿名函数:一行代码实现一个函数功能 。
递归函数
自定义函数:根据自己的需求,来进行定义函数 。
(2)方法的分类:
普通方法:直接用self调用的方法 。
私有方法:__函数名,只能在类中被调用的方法 。
属性方法:@property , 将方法伪装成为属性,让代码看起来更合理 。
特殊方法(双下划线方法):以__init__为例,是用来封装实例化对象的属性,只要是实例化对象就一定会执行__init方法,如果对象子类中没有则会寻找父类(超类),如果父类(超类)也没有,则直接继承object(python 3.x)类,执行类中的__init__方法 。
类方法:通过类名的调用去操作公共模板中的属性和方法 。
静态方法:不用传入类空间、对象的方法,作用是保证代码的一致性,规范性,可以完全独立类外的一个方法,但是为了代码的一致性统一的放到某个模块(py文件)中 。
其次 , 从作用域的角度来分析:
(1)函数作用域:从函数调用开始至函数执行完成 , 返回给调用者后 , 在执行过程中开辟的空间会自动释放,也就是说函数执行完成后,函数体内部通过赋值等方式修改变量的值不会保留,会随着返回给调用者后,开辟的空间会自动释放 。
(2)方法作用域:通过实例化的对象进行方法的调用,调用后开辟的空间不会释放,也就是说调用方法中对变量的修改值会一直保留 。
最后,调用的方式不同 。
(1)函数:通过“函数名()”的方式进行调用 。
(2)方法:通过“对象.方法名”的方式进行调用 。
class Foo(object):def func(self):pass#实例化obj = Foo()# 执行方式一:调用的func是方法obj.func() #func 方法# 执行方式二:调用的func是函数Foo.func(123) # 函数
Python中几个特殊的函数1、 定义一个特殊的__slots__变量,来限制该class实例能添加的属性
2、 内置的@property(关键字)装饰器就是负责把一个方法变成属性调用的 。@property.setter(这里的property是类里面的属性名)负责把一个setter方法变成属性赋值 。
3、__str__(),__repr__(),__iter__(),__next__(),__getitem__() , __setitem__(),__delitem__(),__getattr__(),__call__()
Python中的几种特殊数据类型小结下面介绍python特殊化函数了Python中python特殊化函数的6种特殊数据类型python特殊化函数:
1.list:列表
是一种有序的数据集合python特殊化函数,在列表数据结构中的类型并不唯一
定义形式:L=['Micha',100,True]
输出整个列表的时候显示为['Micha',100,True]
输出单个的数值则为:Micha
a.访问,直接使用L[0]表示第一个元素或者使用L[-1]表示最后一个数据,以此类推 , 但是注意访问不能越界(访问的序号不能超过元素的总数) 。
b.添加新元素:使用L.append(100)直接将100加入列表末尾 , 或者使用L.insert(0,'paul')将paul插入任意位置 。
c.删除元素:L.pop()删除最后一个元素,或者L.pop(2)删除第2个位置的元素 。
d.替换元素:直接赋值就可以了L[2]=100
2.tuple:元组
是一种有序的列表,但是其一旦创立完毕就不能够更改,即不能插入,删除里面的元素,访问的方式跟List结构一致 。
a.t=()其打印后输出的形式是()
若t中的数据为一个数字则需要在后面加逗号,以区分普通数字,如t=(1,) , 打印出(1,)而非1,多元素的话则没有这个要求 。
b.可以在不变的tuple中加入可变的List如t=(‘a’,'b',['A','B'])
3.dict:字典
d = {
'Adam': 95,
'Lisa': 85,
'Bart': 59
}
len()函数可以计算任意集合的大小
其中可以简单地使用d[key]的形式来查找对应的 value,这和 list很像 , 不同之处是,list必须使用索引返回对应的元素,而dict使用key,当key不存在的时候,使用该key可能出现错误,因此:要避免 KeyError 发生,有两个办法:
一是先判断一下 key 是否存在,用 in 操作符:
if'Paul' in d:
print d['Paul']
如果 'Paul' 不存在,if语句判断为False,自然不会执行print d['Paul'] , 从而避免了错误 。
二是使用dict本身提供的一个 get方法,在Key不存在的时候,返回None:
print d.get('Bart')
59
a.dict中的key不能重复,且dict中的存储的对应值没有顺序,打印出的东西可能是无序的
b.dict的更新:使用d[‘paul']=72求解
c.dict遍历:
d = {'Adam': 95, 'Lisa': 85, 'Bart': 59 }
for key in d:
...print key
遍历只能获得key的值,需要通过key值获得对应的value
4.set:集合
无序但是所有元素唯一,不重复
a.定义:s = set(['A', 'B', 'C']),查看 set的内容:
print s
set(['A','C', 'B'])
可以用in来判断是否存在于集合中
b.遍历
s =set([('Adam', 95), ('Lisa', 85), ('Bart', 59)])
for xin s:
print x[0] ':',x[1]
c.添加元素到集合中
s.add(4)
d.删除元素
s.remove(4)若该元素不在集合中将会报错
5.Unicode编码
Python在后来添加了对Unicode的支持,以Unicode表示的字符串用u'...'表示 , 比如:
printu'中文'
注意: 不加 u,中文就不能正常显示中文 。
a.转义形式: u'中文\n日文\n韩文'
b.输出多行:
u'''第一行
第二行'''
c.raw 多行的形式:
ur'''Python的Unicode字符串支持"中文",
"日文",
"韩文"等多种语言'''
如果中文字符串在Python环境下遇到 UnicodeDecodeError,这是因为.py文件保存的格式有问题 。可以在第一行添加注释
# -*-coding: utf-8 -*-
目的是告诉Python解释器,用UTF-8编码读取源代码 。然后用Notepad另存为,并选择UTF-8格式保存 。
6.raw的作用
如果一个字符串包含很多需要转义的字符,对每一个字符都进行转义会很麻烦 。为了避免这种情况,python特殊化函数我们可以在字符串前面加个前缀 r , 表示这是一个“raw”字符串,里面的字符就不需要转义了 。例如:
r'\(~_~)//'
但是r'...'表示法不能表示多行字符串,也不能表示包含'和 "的字符串,如果要表示多行字符串 。
关于python特殊化函数和python 特殊变量的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- 呼和浩特外卖小程序推广,呼和浩特外卖可以进小区吗
- 禅道重启命令linux,禅道使用流程
- oracle数据库如何关闭自动备份文件,oracle数据库自动关闭原因
- chatgpt概念图,ChatGPT概念图
- mysql怎么存放长文本 mysql怎样存大量文本
- 16年前的手机拍照怎么样,2016年拍照手机
- 酷家乐发光电视柜怎么做,酷家乐定制电视柜教程
- 如何连接国外服务器免费上youtube,怎样连接国外服务器
- 九代cpu什么接口,九代cpu什么接口好