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迭代器&生成器)


文章目录


前言

本文主要介绍了一些魔法方法,以及它们的定义和使用


一、说明

1.函数

def 定义的

2.方法

定义在类class里面的

3.说明

方法是函数的一种特殊情况

4.魔法方法

在python内部已经包含的 被双下划线包围的方法,这些方法,在特定的操作时会被自动调用

python 复制代码
例如:__init__  __iter__  __next__

二、方法介绍

1. __new__方法

说明:

实例化对象时调用的第一个方法 不是__init__ (面试题)

例子

python 复制代码
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__方法

说明

在类的内部实现了这个方法 该类创建的实例化对象也是一个可调用对象

例子

python 复制代码
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__方法

说明

获取类的长度 自己定义 可以定义任意参数作为长度

例子

python 复制代码
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.比较运算符

python 复制代码
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.算术运算符

python 复制代码
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__方法

说明

  • 当用户获取一个不存在的属性的时的行为 当获取到不存在的属性时 我们对抛出的异常进行自定义
python 复制代码
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 实例有哪些属性值

例子

python 复制代码
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

例子

python 复制代码
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  这时候和上面不一样 不是打印地址 而是定制化输出

三、单态(单例)模式

python 复制代码
# 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判断对象是不是可调用的对象
python 复制代码
print(callable(SingObject))  #true  类可调用
# print(callable(s2))          #false 实例化对象不可调用

总结

本文的知识,一定要动手敲一遍,理解其含义。

相关推荐
一只会敲代码的小灰灰4 分钟前
python学习第九节:爬虫实战-抓取地址库
爬虫·python·学习
M_灵均6 分钟前
八股文知识汇总(常考)
java·后端·面试
Successssss~12 分钟前
【南京工业大学主办,JPCS出版】自动化、电气控制系统与设备
运维·人工智能·机器学习·自动化·材料工程
AI原吾20 分钟前
探索自动化的魔法:Python中的pyautogui库
运维·python·自动化
长风清留扬30 分钟前
Python “集合” 100道实战题目练习,巩固知识、检查技术
数据结构·python·面试·跳槽·学习方法·集合·改行学it
鸽芷咕1 小时前
【BUG报错已解决】`ERROR: Failed building wheel for jupyter-nbextensions-configurator`
ide·python·jupyter
拾荒李1 小时前
python学习11-Pytorch张量与数据处理1
pytorch·python·学习
nihui1231 小时前
Java面试篇基础部分-Java序列化
java·开发语言·面试
羽X瞳2 小时前
【3、导致JVM内存泄露的ThreadLocal详解】
java·jvm·python