python中attr_python中的hasattr()、getattr()、setattr()

hasattr()的用法和理解--hasattr(obj, target)

判断对象obj中是否含有,目标target属性,然后返回布尔值,如果有返回True,没有返回False。

>>> class School:

... def __init__(self):

... self.teacher_name = self.teacher

... def teacher(self):

... return input("输入姓名:")

...

>>> s1 = School() #实例化一个学校对象

>>> hasattr(s1, "teacher") #查看s对象中是否有teacher属性(方法)

True #有该属性返回True

>>> hasattr(s1, "student")

False #s对象中没有student属性,返回False

>>>

getattr()的用法--getattr(obj, target)

使用getattr()函数,可以将对象obj中的属性、方法获取出来

>>> class School:

... def __init__(self):

... self.teacher_name = self.teacher

... def teacher(self):

... return input("输入姓名:")

...

>>> s2 = School()

>>> func = getattr(s2, "teacher") #获取s2实例当中的teacher函数,并将其赋值给func

>>> print(func()) #在这儿调用func函数,等于调用teacher函数

输入姓名: lina

'lina'

>>>

>>> getattr(s2, "student") #尝试获取一个对象中不存在的方法

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'School' object has no attribute 'student'

#发生了属性声明错误,该对象中没有想要获得的属性

#当然为了避免出错,可以设置一个默认值

>>> getattr(s2, "student", "AttributeError")

'AttributeError'

>>>

setattr()给对象的属性赋值,如果该属性不存在,那就先创建在赋值--setattr(obj, name, value)

看到这儿我想都能应该明白怎么用了,上一个例子中,最后我们尝试获取一个不存在的属性发生错误,如果我们先用setattr()方法,那么就可先向对象中创建该属性、方法

>>> class School:

... def __init__(self):

... self.teacher_name = self.teacher

... def teacher(self):

... return input("输入姓名:")

...

>>>

>>> def student():

... return input("学生姓名:")

...

>>> setattr(School, "student", student) #直接往School类当中设置名字为"student"的方法student也是可以的,

>>>School.student() #现在在School类当中直接调用student()方法就不会报错了

学生姓名:luna

'luna'

>>> s3 = School()

>>> s3.__setattr__("stu", student) #类中的隐藏函数__setattr__(name, value) 也可以完成设置属性、方法

>>> s3.stu()

学生姓名:Amber

'Amber'

>>>

hasattr()、getattr()思考拓展

很多时候我们面对一个未知的程序,未知的类。也不能去瞎改别人的代码,而这两个函数就可以帮助我们测试,加上setattr()就可以直接打补丁,来修改以达到我们目的。

而hasattr()和getattr()更为重要的应用当然还是,关系映射。

都知道类与类之间或者与函数、对象之间,相联系的方式有继承、派生和类的组合。而这些方式都需要直接联系。

而hasattr()、和getattr() 就可以帮助我们达到 A.a -------> B.b 将两个毫不相干的对象建立关系映射。甚至随便建立多级映射,C B 而不影响映射的函数或者类。

如现在我们写一个可以完成和用户交互,实现上传、下载、查看目录的类,具体业务逻辑函数就不赘写了!主要看使用hanattr()和getattr()交互、调用逻辑函数

import socket

class UploadDownload:

"""

这是一个具有连上远程服务器,发送命令实现上传下载功能的类

_connect() 链接远程服务器

"""

def __init__(self, IP, PORT):

self.ip = IP

self.port = PORT

self.sock = self._connect() #调用_connect()函数链接远程服务器

self.commands = ["upload", "download", "directory"]

def _connect(self):

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((self.ip, self.port))

return s

def _command(self):

while True:

print("Enter cmd like this : upload /home/user/lina/dance.mp4") #提示输入格式

cmd = input("Enter cmd :").strip() #输入指定命令格式,并去除空格

if not cmd:

continue

else:

cmds = cmd.split('') #简单处理,将命令和参数分开

if cmds[0] in self.commands: #如果是可执行命令,就尝试查找可执行函数

try:

if hasattr(self,cmds[0]): # 在类中查找该命令的逻辑函数

func = getattr(self, cmds[0]) #存在就获得该函数,并在下一步传入参数执行

func(cmds[1])

else:

print("请输入正确的命令格式")

continue

except Exception as e:

print(e)

def upload(self, dir):

#这个函数用来上传

pass

def download(self, dir):

#这个函数用来下载

pass

def directory(self, dir):

#此函数查看文件目录

pass

ud = UploadDownload("localhost",5000)

ud._command()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值