python基础(13魔法方法介绍)
python系列文章目录
python基础(01变量&数据类型&运算符)
python基础(02序列共性)
python基础(03列表和元组)
python基础(04字符串&字典)
python基础(05集合set)
python基础(06控制语句)
python基础(07函数)
python基础(08类和对象)
python基础(09闭包&装饰器)
python基础(10异常处理)
python基础(11文件读取)
python基础(12迭代器&生成器)
文章目录
- python系列文章目录
- 前言
- 一、说明
- 二、方法介绍
- 1. __new__方法
- 2.__call__方法
- 3.__len__方法
- 4.比较运算符
- 5.算术运算符
- 6.__getattr__方法
- 7.__setattr__方法(self,key,value)
- 8.__str__和__repr__方法
- 三、单态(单例)模式
- 四、callable()知识点
- 总结
前言
本文主要介绍了一些魔法方法,以及它们的定义和使用
一、说明
1.函数
def 定义的
2.方法
定义在类class里面的
3.说明
方法是函数的一种特殊情况
4.魔法方法
在python内部已经包含的 被双下划线包围的方法,这些方法,在特定的操作时会被自动调用
例如:__init__ __iter__ __next__
二、方法介绍
1. __new__方法
说明:
实例化对象时调用的第一个方法 不是__init__ (面试题)
例子
class Cat():
#__new__ 第一个参数为cls,代表要实例化的类(Cat),其他参数直接传给__init__方法
def __new__(cls,*args,**kwargs):
print("this is new")
#__new__对当前类进行实例化,一定要返回这个实例化对象 传递给__init__中的self
# 如果return这行注释掉 __init__的self就没有数据 init方法内都不会执行 笔试题
# return object.__new__(cls)
#return的第二种写法 一样的效果 继承也有两种方法 也有super
return super(Cat,cls).__new__(cls)
#__init__的self就是__new__返回的实例
def __init__(self):
print("this is init")
print(self) #打印这个实例<__main__.Cat object at 0x00000262B6613EE0> 对象
print(self.__class__) #打印这个实例的类<class '__main__.Cat'> 类
cat=Cat()
cat1=Cat()
#这里的cat和cat1是两个对象 地址不一样
2.__call__方法
说明
在类的内部实现了这个方法 该类创建的实例化对象也是一个可调用对象
例子
class Animal:
def __init__(self,name,age):
self.name=name
self.age=age
def __call__(self,food):
print(f"my name is {self.name},i am {self.age} old")
print(f"i eat {food}")
dog=Animal("taidi","3")
print(callable(Animal)) #true
print(callable(dog)) #true
dog("meat") #可以调用
3.__len__方法
说明
获取类的长度 自己定义 可以定义任意参数作为长度
例子
class Animal:
def __init__(self,name,age):
self.name=name
self.age=age
def __call__(self,food):
print(f"my name is {self.name},i am {self.age} old")
print(f"i eat {food}")
def __len__(self):
return len(self.name)
cat=Animal("咪咪123","5")
cat("age")
print(len(cat)) #5
4.比较运算符
class Animal:
def __init__(self,name,age):
self.name=name
self.age=age
def __call__(self,food):
print(f"my name is {self.name},i am {self.age} old")
print(f"i eat {food}")
def __len__(self):
return len(self.name)
def __eq__(self, other):
return self.age==other.age
cat=Animal("咪咪","5")
dog=Animal("taidi","3")
print(dog==cat) #false
5.算术运算符
class Vector:
def __init__(self,a,b):
self.a=a
self.b = b
def __add__(self, other):
return Vector(self.a+other.a,self.b+other.b)
v1=Vector(1,2)
v2=Vector(2,3)
v3=v1+v2
print(v3.a,v3.b) #3,5
6.__getattr__方法
说明
- 当用户获取一个不存在的属性的时的行为 当获取到不存在的属性时 我们对抛出的异常进行自定义
class Vector:
def __init__(self,a,b):
self.a=a
self.b = b
def __add__(self, other):
return Vector(self.a+other.a,self.b+other.b)
def __getattr__(self, name):
print(f"sorry no {name}")
v1=Vector(1,2)
v2=Vector(2,3)
v3=v1+v2
print(v1.c) #sorry no c None
7.__setattr__方法(self,key,value)
说明
- 当一个属性被设置时的行为
- 当类实例每个属性进行赋值时,都会首先调用setattr方法 并且在该方法中将属性名和属性值添加到类实例的__dict__属性中
- #dict 实例有哪些属性值
例子
class Animal:
def __init__(self,name,age):
# print(self.__dict__)
self.name=name
# print(self.__dict__)
self.age=age
# print(self.__dict__)
# def __setattr__(self, key, value):
# print("-"*30)
# print(f"setting key is {key},valve is {value}")
# print(f"current __dict__ is {self.__dict__}")
# #将属性添加到dict中
# self.__dict__[key]=value
# cat=Animal("咪咪","5")
# print(cat.name,cat.age) #本质是访问dict里面的属性
# print(cat) #地址
8.__str__和__repr__方法
说明
- str:定制化显示输出信息 给用户看的
- repr:定制化显示输出信息 给开发者看的 交互模式下可以直接打印出 pig
例子
class Animal:
def __init__(self,name,age):
# print(self.__dict__)
self.name=name
# print(self.__dict__)
self.age=age
def __str__(self):
return f"i am {self.name},i am {self.age} old"
def __repr__(self):
return f"animal am {self.name},animal am {self.age} old"
pig=Animal("zhu","7")
print(pig) #i am zhu,i am 7 old 这时候和上面不一样 不是打印地址 而是定制化输出
三、单态(单例)模式
# class SingObject:
#两个类变量
instanced=None
first_init=False
def __new__(cls, *args, **kwargs):
#如果这个实例是空的 就进行赋值
if not cls.instanced:
cls.instanced=object.__new__(cls)
return cls.instanced
def __init__(self,age,name):
if not self.first_init:
self.age=age
self.name=name
# 这行如果注释掉 就会打印两个 20 hello 两个是一个对象 一个地址 赋值记住最后一个的
SingObject.first_init=True
s1=SingObject(18,"jiajia")
s2=SingObject(20,"hello")
---------------------------------------------------
# #地址一样 同样的对象 这就是单例模式
# #两个都会打印出18 jiajia
# print(s1.age,s1.name)
# print(s2.age,s2.name)
四、callable()知识点
可调用对象
- 凡是可以将()直接应用到自身并执行的 包括自己定义的函数 内置函数 类
- #callable判断对象是不是可调用的对象
print(callable(SingObject)) #true 类可调用
# print(callable(s2)) #false 实例化对象不可调用
总结
本文的知识,一定要动手敲一遍,理解其含义。