Python_魔法属性和方法

news2024/11/23 20:30:32

目录

魔法属性

__doc__

__moudle__

__class__

__name__

__dict__

魔法方法

__new__()

__init__ ()

__del__() 

__call__()

__str__ ()

__getitem__(),__setitem__(),__delitem__()

__setattr__()、__getattr__()

__iter__()

__next__()

__enter__(),__exit__()


在接下来的文章中,我将与大家伙一起探讨Python编程语言中的魔法属性和方法。

Python作为一门功能强大且灵活的编程语言,提供了许多特殊的属性和方法,被称为“魔法属性和方法”。

这些特殊的属性和方法可以帮助我们实现更高级的功能,例如操作对象属性、修改类行为以及自定义运算符等。

无论你是初学者还是有经验的开发者,本文将为你详细介绍Python中的魔法属性和方法,并帮助你更好地理解和应用它们。让我们一起往下看吧!

魔法属性

__doc__

获取类或方法的描述信息

class Foo:
    """ 类对象__doc__的属性值"""

    def func(self):
        """ 类方法的__doc__属性值 """
        pass


foo = Foo()

print("类对象的__doc__:", Foo.__doc__)
print("实例对象的__doc__:", foo.__doc__)
print("实例对象方法的__doc__:", foo.func.__doc__)

__moudle__

获取操作的所属模块,当模块在当前执行文件中时,显示__main__

class Foo:
    """ 类对象__doc__的属性值"""

    def func(self):
        """ 类方法的__doc__属性值 """
        pass


foo = Foo()

print("类对象的__module__:", Foo.__module__)
print("实例对象的__module__:", foo.__module__)
print("实例对象方法的__module__:", foo.func.__module__)

__class__

获取操作对象的源对象。多用于通过实例对象反向获取类对象

class Foo:
    """ 类对象__doc__的属性值"""

    def func(self):
        """ 类方法的__doc__属性值 """
        pass

    @classmethod
    def cls_func(cls):
        print("cls方法被调用")


foo = Foo()

print("类对象的源引用为Type元类:", Foo.__class__)
print("实例对象的源引用为Foo类对象:", foo.__class__)
print(Foo)

__name__

获取类或方法的名称

class Foo:
    """ 类对象__doc__的属性值"""

    def func(self):
        """ 类方法的__doc__属性值 """
        pass


foo = Foo()
print("类对象的__name__:", Foo.__name__)
print("实例对象方法的__name__:", foo.func.__name__)

__dict__

获取类或对象中的所有属性

class Province(object):
    country = 'China'

    def __init__(self, name, count):
        self.name = name
        self.count = count

    def func(self, *args, **kwargs):
        print('func')


# 获取类的属性,即:类属性、方法
print(Province.__dict__)
# 输出:{'__dict__': <attribute '__dict__' of 'Province' objects>, '__module__': '__main__', 'country': 'China', '__doc__': None, '__weakref__': <attribute '__weakref__' of 'Province' objects>, 'func': <function Province.func at 0x101897950>, '__init__': <function Province.__init__ at 0x1018978c8>}

obj1 = Province('山东', 10000)
print(obj1.__dict__)
# 获取 对象obj1 的属性
# 输出:{'count': 10000, 'name': '山东'}

obj2 = Province('山西', 20000)
print(obj2.__dict__)
# 获取 对象obj1 的属性
# 输出:{'count': 20000, 'name': '山西'}

魔法方法

__new__()

为对象分配内存空间,同时还返回对象的引用,在__init__()之前被调用

__init__ ()

初始化实例对象属性的方法,创建实例对象时被调用。

__init__方法中定义的实例属性如果指向的是方法(包括被 property装饰的方法),在实例化时,会立即执行指向的方法,并将return值赋值给实例属性。当实例属性被多次调用时,也不会去执行指向的方法。

注意:利用该特效可以解决一次赋值多次使用的高耗时场景

class Demo:

    def __init__(self):
        self.excel_info = self.mock_read_excel()
        print("实例化完成")

    def mock_read_excel(self):
        print("读取文件")
        return "excel数据"

    def mock_use_1(self):
        return self.excel_info

    def mock_use_2(self):
        return self.excel_info

    def mock_use_3(self):
        return self.excel_info


if __name__ == '__main__':
    demo = Demo()
    demo.mock_use_1()
    demo.mock_use_2()
    demo.mock_use_3()

__del__() 

当对象在内存中被释放时被调用

注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,__del__的调用是由解释器在进行垃圾回收时自动触发执行的。

class Foo:
    def __del__(self):
        pass

__call__()

对象后面加括号,触发执行

注:__init__方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

class Foo:
    def __init__(self):
        pass

    def __call__(self, *args, **kwargs):
        print('__call__')


obj = Foo()  # 执行 __init__
obj()  # 执行 __call__

__str__ ()

如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。

class Foo:
    def __str__(self):
        return 'laowang'


obj = Foo()
print(obj)
# 输出:laowang

__getitem__(),__setitem__(),__delitem__()

用于索引操作,如字典。以上分别表示获取、设置、删除数据

# -*- coding:utf-8 -*-

class Foo(object):

    def __getitem__(self, key):
        print('__getitem__', key)

    def __setitem__(self, key, value):
        print('__setitem__', key, value)

    def __delitem__(self, key):
        print('__delitem__', key)


obj = Foo()

result = obj['k1']      # 自动触发执行 __getitem__
obj['k2'] = 'laowang'   # 自动触发执行 __setitem__
del obj['k1']           # 自动触发执行 __delitem__

__setattr__()、__getattr__()

__setattr__():定义属性时被调用。包括外部和内部

__getattr__():如果类中不定义该方法,在获取不存在的实例属性时会报 AttributeError;如果定义了该方法,当获取未被定义的属性时执行该方法,如果成功获取到属性则不执行该方法。

class Province(object):

    def __init__(self):
        self.v = "test"     # 在内部,每一次定义实例属性都会调用 __setattr__ 方法
        a = self.s          # 在内部,每一次获取实例属性但属性不存在时调用 __getattr__ 方法
        print("a变量的值为 " + a)
        b = self.v
        print("b变量的值为 " + b)

    def __setattr__(self, key, value):
        print("定义实例属性时被调用")
        super(Province, self).__setattr__(key, value)

    def __getattr__(self, item):
        print("当获取未被定义的属性时执行该方法,如果获取到属性则不调用该方法")
        return "null"


print("===================实例化")
t = Province()

print("===================外部设置实例属性")
setattr(t, "c", "test1234")
t.d = "test2234"

print("===================外部获取实例属性")
print(t.v)
print(getattr(t, "d"))
print(t.ssss)   # 获取不存在的属性
print(getattr(t, "fffff"))  # 获取不存在的属性

__iter__()

让一个对象变得可以迭代

__next__()

定义一个迭代器,让其能够通过next(迭代对象的迭代器)对一个可迭代对象进行迭代

__enter__(),__exit__()

用于定义上下文管理器


-事必有法,然后有成- 最后祝大家早日达到测试的天花板!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/723531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

构建LLM应用你所要知道的事情;Midjourney可以生成图片外的场景

&#x1f989; AI新闻 &#x1f680; AI作画工具Midjourney推出新功能"Pan"&#xff0c;可以生成图片外的场景 摘要&#xff1a;AI作画工具Midjourney最近推出了"pan"功能&#xff0c;用户可以通过控制输入框中的"上下左右"来平移图片以生成场…

【案例】VR全景图:效果+源码

狠人话不多说,直接放视频效果地址 一、效果 1.视频效果 视频效果地址:点击这里 2.图片效果 二、构思 该怎么实现?页面如何布局页面是否可随意控制显示1.功能 控制页面显示数量可放大控制全景图+自动播放左右按钮控制上一页或下一页(尾页:下一页按钮隐藏,首页:上一页按…

Spring Boot 中的熔断器:原理和使用

Spring Boot 中的熔断器&#xff1a;原理和使用 什么是熔断器&#xff1f; 熔断器是一种用于处理分布式系统中故障的设计模式。它可以防止出现故障的服务对整个系统造成连锁反应。熔断器通过监控故障服务的调用情况&#xff0c;当故障服务出现问题时&#xff0c;熔断器会迅速…

【vue】Vue3中使用函数调用组件内函数和创建组件【超详细】

uniappuview vue3typescript版本&#xff0c;使用函数方式调用和创建组件&#xff0c;并使用组件内的方法 项目场景 今天突然觉得在视图上应用组件&#xff0c;然后在script脚本里操作组件这方式特别的麻烦。因为每次使用组件时都要进行应用&#xff0c;不管你用不用你都要引…

TDengine“露面”中国油气田企业智慧油田技术交流大会,为时序数据处理带来全新思路

2023 年 7 月 4 日- 6 日&#xff0c;由中国石油和化学工业联合会主办&#xff0c;中国石油油气和新能源分公司、中国石化油田勘探开发事业部、中国海洋石油有限公司勘探开发部协办的“中国油气田企业智慧油田技术交流大会”在北京市召开。本次大会邀请了中国石油、中国石化、中…

Android Studio实现内容丰富的安卓房屋出租租赁平台

如需源码可以添加q-------3290510686&#xff0c;也有演示视频演示具体功能&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动。 项目编号063 1.开发环境 android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看租房列表…

SSMP整合案例(12) 在界面中实现删除操作

接下来我们来说删除 首先 我们要在表格上加上删除和修改两个操作按钮 我们先在App.vue页面部分编写 参考代码如下 <el-table-columnalign"right"label"操作" ><template slot-scope"scope"><el-buttonsize"mini"type…

王道考研数据结构——基本概念

06 算法的时间复杂度 线性的时间复杂度 O(n^3)O(n^2*logn) O(n^3) O(logN) 无法确定&#xff0c;和输入的数据量有关系&#xff0c;使用平均复杂度&#xff1a; 最坏/平均时间复杂度 07 算法的空间复杂度 S(n)n S(n)O(n^2) 刷题&#xff1a; O(n^3) 答案&#xff1a; B…

Maven 配置本地jar,通过下载第三方jar包,然后手动配置maven jar包依赖 例如:IKExpression

说明&#xff1a;有时候有一些jar包 maven中央仓库和阿里云仓库没有收录的jar包需要手动下载至本地进行手动添加maven依赖&#xff0c;就拿 IK表达式 IKExpression jar 包来说 第一步 下载IKExpression 包 没有这个包的同学可以点击下载阿里云盘分享 第二步 找到自己项目本地…

vue3+elementUiplus开发的项目如何修改公共标签的默认颜色

背景:使用elementUiplus开发路由菜单栏需要更改默认颜色 步骤: 查看用到的变量 如:var(–el-menu-bg-color); 修改: index.scss文件下进行style的修改 :root {--el-color-primary: #0cba80 !important; // 主题色--el-color-primary-dark-2: #0cba80 !important;--el-color-…

datagrip連接mysql數據連接不上

昨天使用datagrip進行數據庫的連接時發現遲遲連接不上&#xff0c;問了老大才發現問題是&#xff1a; 在host中是無需要加入jdbc:mysql://這些的&#xff0c;只需要將wiltechs-based…放入host中即可

3D点云实战案例

sd推荐免费3D场景建模工具&#xff1a;NSDT场景编辑器 CloudCompare是一个三维点云&#xff08;网格&#xff09;编辑和处理软件。最初&#xff0c;它被设计用来对稠密的三维点云进行直接比较。它依赖于一种特定的八叉树结构&#xff0c;在进行点云对比这类任务时具有出色的性…

vue前端权限控制设计

概述 vue前端和后端程序是分离开发的&#xff0c;既然是分离的&#xff0c;vue前端怎么进行用户权限控制呢&#xff1f;本文介绍vue前端权限控制的方法&#xff0c;包括后端接口访问权限、页面操作按钮的权限、菜单的查看权限和vue路由的访问权限。 后端接口的访问权限 后端…

【服务器必备】Docker:使用容器技术,轻松部署应用

1、介绍 1.1 docker是什么&#xff1f;&#xff08;来自于维基百科&#xff09; Docker是一种流行的容器化技术&#xff0c;它能够帮助开发人员和运维人员更快、更轻松地部署和管理应用程序。通过使用Docker&#xff0c;您可以将应用程序及其依赖项打包到一个轻量级、可移植的…

spring系列-Spring Boot从初识到实战

Spring Boot从初识到实战 一、Hello Spring Boot 1、Spring Boot 简介 简化Spring应用开发的一个框架&#xff1b; 整个Spring技术栈的一个大整合&#xff1b; J2EE开发的一站式解决方案&#xff1b; 2、微服务 微服务&#xff1a;架构风格&#xff08;服务微化&#xff09; 一…

问你个问题,项目进度怎样控制才有效?

早上好&#xff0c;我是老原。 有多少项目经理&#xff0c;每天都被项目进度搞得焦头烂额。 对于项目经理们来说&#xff0c;最可怕的事情莫过于项目虽然还在&#xff0c;但时间却没了…… 试问谁不想把项目和进度都牢牢握在手里&#xff0c;享受运筹帷幄的感觉&#xff0c;…

多领域应用落地,火山引擎ByteHouse加速云数仓升级

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 近日&#xff0c;火山引擎数智平台VeDI直播活动「超话数据」在线举办&#xff0c;来自火山引擎的产品及解决方案专家分享了以ByteHouse为代表的云数仓产品在字节跳动…

【设计模式】第十一章:享元模式详解及应用案例

系列文章 【设计模式】七大设计原则 【设计模式】第一章&#xff1a;单例模式 【设计模式】第二章&#xff1a;工厂模式 【设计模式】第三章&#xff1a;建造者模式 【设计模式】第四章&#xff1a;原型模式 【设计模式】第五章&#xff1a;适配器模式 【设计模式】第六章&…

每周学点数学 3:概率论基础2

文章目录 1.独立性与相关性2.条件概率与边缘概率3.大数定律与中心极限定理4.随机过程5.概率论的应用 1.独立性与相关性 独立性与相关性是在数据分析中非常重要的两个概念&#xff0c;它们之间存在一定的联系&#xff0c;但也有明显的区别。 独立性&#xff08;Independence&…

CSS(持续更新!~)

二&#xff1a; 进阶&#xff1a; 只打算起到装饰作用的图片就建议就背景图片 块级标签就是&#xff1a;独占一行的标签&#xff08;比如div&#xff09;并且可以加宽加高 行内元素&#xff1a;就是不会独占一行的标签&#xff08;比如a&#xff0c;span等等&#xff0c;不可以…