当前位置: 首页 > article >正文

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 实例化对象不可调用

总结

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


http://www.kler.cn/a/282553.html

相关文章:

  • 向潜在安全信息和事件管理 SIEM 提供商提出的六个问题
  • React Hooks 深度解析与实战
  • outline 分析
  • sql注入之二次注入(sqlilabs-less24)
  • 1、使用vscode+eide+stm32cubeMx开发stm32
  • AlphaFold3中文使用说明
  • Axure原型设计技巧与设计经验分享
  • 我的docker随笔44:构建nginx镜像
  • 揭示灵活分布式云平台的速效降本之道
  • CSS 的超级好用的object-fit属性
  • git服务搭建
  • tomcat实验
  • 小程序组件生命周期和获取组件实例
  • 「Python程序设计」基本数据类型:列表(数组)
  • 理解数据库系统的内部结构
  • UE5-----Niagara粒子系统
  • 10080-0-监测文件夹并解压压缩包-支持zip-rar-7z压缩包的解压-不支持子文件夹/密码/多层嵌套压缩包解压-UI
  • 在Linux下搭建go环境
  • 设计模式-常见的设计原则或最佳实践
  • 【RNN】循环神经网络RNN学习笔记
  • FaceFormer嘴形同步论文复现
  • 指令微调的训练策略
  • Spring Cloud Stream与Kafka(二)
  • 基于RK3568智慧交通-雷达视频融合一体机,支持鸿蒙
  • 量子计算与未来的渗透技术(壹)
  • protostuff序列化方式学习