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的第二种写法 一样的效果 继承也有两种方法 也有superreturn 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=nameself.age=agedef __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=nameself.age=agedef __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=nameself.age=agedef __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=aself.b = bdef __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=aself.b = bdef __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=agedef __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=Nonefirst_init=Falsedef __new__(cls, *args, **kwargs):#如果这个实例是空的 就进行赋值if not cls.instanced:cls.instanced=object.__new__(cls)return cls.instanceddef __init__(self,age,name):if not self.first_init:self.age=ageself.name=name# 这行如果注释掉 就会打印两个 20 hello 两个是一个对象 一个地址 赋值记住最后一个的SingObject.first_init=Trues1=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 实例化对象不可调用
总结
本文的知识,一定要动手敲一遍,理解其含义。