首页 > 编程语言 >Python函数介绍:getattr()、setattr()、hasattr()

Python函数介绍:getattr()、setattr()、hasattr()

时间:2023-05-06 15:11:10浏览次数:37  
标签:boy name setattr Python self 对象 getattr 实例

  在Python中我们通常对类的操作中,常常会判定某个属性是否是在这个类中,也会动态的为这个类更改\增添的某些属性和方法。这时我们会常常用到这个几个重要的Python内置函数,分别是getattr()、setattr()、hasattr()。

1、getattr(obj, name[, default])

  obj 表示指定的类实例对象(类对象),name 表示指定的类的成员名称(除了属性可以访问,方法也可以),而 default 是可选参数,用于设定该函数的默认返回值,即当函数查找失败时,如果不指定 default 参数,则程序将直接报 AttributeError 错误,反之该函数将返回 default 指定的值。我们需要注意的是这里的name是字符串类型,表示类成员的名称。看例子:

class MyClass:
    name = "类变量name"

    def __init__(self, name, age):
        self.name = name
        self.add = age

    def say(self):
        print(f"{self.name}正在学Python")

boy = MyClass("小王", 14)
print("访问实例属性: ", getattr(boy, "name"))
print("访问类属性: ", getattr(MyClass, "name"))
print("访问类的方法: ", getattr(boy, "say"))
my_fun = getattr(boy, "say")
my_fun()
print(getattr(boy, "friends", "无朋友"))

  我们创建了一个类MyClass,这个类有一个类成员(属性)name是所有实例对象公用的,这个类还有一个成员是say这个函数。代码第11行我们创建了一个对MyClass实例对象,并在之后通过使用getattr()函数访问实例对象的相关属性。并且在15行时,用my_fun这个变量指向了boy.say方法,我们在16行执行my_fun时其实就是在执行boy.say()。因此上述代码最终执行结果如下:

   从例子中可以看到,我们对实例对象的所包括的成员通过getattr()访问,也可以对类对象包括的成员进行访问(如代码的第13行)。甚至我们可以将实例的某些方法进行引用(代码的15行)。

2、setattr(obj, name, value)

  setattr()函数可以修改类实例对象(或类对象)中的成员值。其次,它还可以为实例对象(或类对象)动态添加属性或者方法。obj表示指定的类对象(或实例对象),name是成员(可以是属性,也可以是方法)名字的字符串,value表示更改后的值。该函数可以修改已经存在的成员,也可以添加不存在的成员。看例子:

class MyClass:
    name = "类变量name"

    def __init__(self, name, age):
        self.name = name
        self.add = age

    def say(self):
        print(f"{self.name}正在学Python")

boy = MyClass("小王", 14)
print("修改前实例名: ", boy.name)
setattr(boy, "name", "修改后的名字")
print("修改后实例名: ", boy.name)

setattr(MyClass, "name", "修改类变量")
print("\n修改后类变量: ", MyClass.name)


def new_fun():
    print("\n动态实例函数被执行")

def new_class_fun(self):
    print(f"\n可以访问实例对象的成员: {self.name}")

setattr(boy, "newFun1", new_fun)
setattr(MyClass, "newFun2", new_class_fun)
boy.newFun1()
boy.newFun2()

  我们依然是在11行处生成了一个对象,在13行时我们将boy这个对象的name属性(注意这里只会改变实例属性name,类属性并不会被改变)。第16行我们通过传入类对象,改变类的属性name。第20行和第23行我们在类的外部定义了两个函数,其中new_class_fun()函数有一个参数需要传入。26行和27行我们将这两个函数分别绑定到了boy实例对象和MyClass类对象上。因此我们就可以调用这些方法了。下面是执行结果。

   需要注意的是我们给类对象赋予方法时,这些方法需要至少传入一个参数才行,这个参数在实例对象调用时默认传入的是对象本身。

3、hasattr(obj, name)

  hasattr() 函数用来判断某个实例对象(或者类对象)是否包含指定名称的属性或方法。如果包含则返回True,否则返回False。这个函数比较简单就不给例子了。

4、总结

  setattr()、getattr()是Python用于方便我们对类或者实例进行动态操作的函数,需要提到的是其寻找属性的顺序是:如果传入的是实例对象,那么将会从实例对象成员——>类成员——>父类成员的顺序进行寻找,如果在某一层找到符合name的成员名则停止查找,因此我们在使用setattr()、getattr()要特别注意同名情况的处理。

 

标签:boy,name,setattr,Python,self,对象,getattr,实例
From: https://www.cnblogs.com/CircleWang/p/17376811.html

相关文章

  • 使用python脚本传递参数:(三种方式可收藏)
    背景:使用python脚本传递参数在实际工作过程中还是比较常用,以下提供了好几种的实现方式:一、使用sys.argv的数组传入说明:使用sys.argv必须按照先后的顺序传入对应的参数;sys.argv则封装了传入的参数数据,作为数组的方式已经传入importsysprint("传入参数的总长度为:",len(sys.ar......
  • WEB|[SUCTF 2019]Pythonginx
    源码@app.route('/getUrl',methods=['GET','POST'])defgetUrl():url=request.args.get("url")host=parse.urlparse(url).hostnameifhost=='suctf.cc':#解析主机名,不能是suctf.ccreturn......
  • python IO多路复用理解记录
    一、简述:1什么是多路I/O复用机制Python中的多路I/O复用机制是一种高效的编程技巧,用于同时监视多个文件描述符是否有可读、可写或错误事件,并在这些描述符中任意一个或多个有事件发生时立即进行响应。2使用多路I/O复用机制的目的同时处理多个连接时提高网络I/O效率,从......
  • python中的报错:dictionary changed size during iteration
    该报错是一个python中常见的错误,通常在使用for循环迭代字典时删除其中的元素时出现。这个问题的根本原因在于迭代字典的同时修改了它,导致字典的大小发生了变化。如下面的例子,就会报错:d={"a":1,"b":2,"c':3}fork,vind.items():ifv==2:deld[k]上述......
  • Python之路,Day21 - 常用算法学习
    本节内容算法定义时间复杂度空间复杂度常用算法实例 1.算法定义算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,......
  • Python之路,Day15 - Django适当进阶篇
    本节内容学员管理系统练习DjangoORM操作进阶用户认证 1.Django练习小项目:学员管理系统设计开发带着项目需求学习是最有趣和效率最高的,今天就来基于下面的需求来继续学习Django 项目需求:1.分讲师\学员\课程顾问角色,2.学员可以属于多个班级,学员成绩按课程分别统计3.每个......
  • python测试
    当你在写Python代码的时候,你希望确保它能够正常运行并返回正确的结果。这就是测试的重要性。在Python中,常用的测试框架是unittest。使用unittest,你可以写测试用例,这些测试用例可以测试你的代码是否按照预期方式工作。以下是一个简单的Python测试教程:1.导入unittest模块import......
  • python 创建虚拟环境以及数据迁移和.Django创建app
    一.python创建虚拟环境1.1首先要确认在那个位置创建虚拟环境创建命令virtualenv虚拟环境名称二.python数据迁移1.生成迁移文件pythonmanage.pymakemigrations2.同步到数据库中pythonmanage.pymigrate三.Django创建apppythonmanage.pystartappAPP名称......
  • 【Python】Beautiful Soup
    简介BeautifulSoup对象我全部使用soup表示;BeautifulSoup简介:简单来说,BeautifulSoup是python的一个库,最主要的功能是从网页抓取数据。1、创建BeautifulSoup对象1.1soup.prettify()frombs4importBeautifulSouphtml_content="""<html><head><title>TheDor......
  • Linux下搭建Python2.7环境
    Python(英语发音:/ˈpaɪθən/),是一种面向对象、解释型计算机程序设计语言,由1989年底发明。python具有简单、易学、免费、开源、可移植性、解释性、可嵌入性等特点,是一种不受局限、跨平台的开源编程语言,它功能强大且简单易学,因而得到了广泛应用和支持。1.Python下载Pyt......