码迷,mamicode.com
首页 > 编程语言 > 详细

python学习之类的反射(2018.6.18)

时间:2018-06-18 21:49:35      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:用法   mds   命令   als   inpu   country   基本应用   attribute   lex   

在学习网络编程的时候用到反射,然后发现自己反射这部分的应用不是很熟练,决定返回来重新整理一下

对于类的反射,主要有四个用法,下面都说一下

1.hasattr 判断对象或者类是否存在指定的属性,看代码以及结果

class people:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def talk(self):
        print("%s is talking."%self.name)

p1 = people(alex,18)
print(hasattr(p1,name))
print(hasattr(p1,sex))

结果
True
False

hasattr判断完成后,会返回一个布尔值,有就返回True,无就返回False

 

2.getattr 获取到一个对象或者类的属性,加()就是执行,看代码

class people:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def talk(self):
        print("%s is talking."%self.name)

p1 = people(alex,18)
print(getattr(p1,name))
print(getattr(p1,sex,man))
print(getattr(p1,sex))

结果
alex
man
  File "D:/PycharmProjects/s2018/day6/test.py", line 13, in <module>
    print(getattr(p1,sex))
AttributeError: people object has no attribute sex

对于getattr,如果对象或者是类有输入的属性,则,返回正确属性。无则报错,如果我们指定默认值,则返回默认值,在看一下其他

class people:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

    def talk(self):
        print("%s is talking."%self.name)

p1 = people(alex,18,woman)

getattr(p1,talk)()#getattr获取到方法后加()就是执行
print(getattr(p1,sex,man))#类内如果对属性已经确认过,显示对象已经确认的值,而不显示默认值

结果
alex is talking.
woman

3.setattr 是修改已有的属性或者是新加一个属性,看代码

class people:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

    def talk(self):
        print("%s is talking."%self.name)

p1 = people(alex,18,woman)

print(修改前,p1.age)
setattr(p1,age,20)
print(修改后,p1.age)
setattr(p1,country,China)
print(p1.__dict__)

结果
修改前 18
修改后 20
{country: China, name: alex, sex: woman, age: 20}

4.delattr就是对现有的对象或者类的属性就行删除,这个比较简单,看代码

class people:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

    def talk(self):
        print("%s is talking."%self.name)

p1 = people(alex,18,woman)

print(修改前,p1.__dict__)
delattr(p1,name)
print(修改后,p1.__dict__)

结果
修改前 {age: 18, name: alex, sex: woman}
修改后 {age: 18, sex: woman}

 

5.学会基本的,还是需要一些应用才可以,写一个比较的应用,正好也是我在网络编程中需要的,看代码

class Servers:#定义一个服务器类
    def run(self):#定义方法run
        while True:
            cmds = input(">>>>:").strip().split()#将输入的命令行进行分解,分解成前面命令以及后面的文件名
            if hasattr(self,cmds[0]):#判断是否有命令!
                func = getattr(self,cmds[0])#如果命令存在则执行
                func(cmds)
            else:
                print(你的输入错误!)
                continue

    def get(self,cmds):#演示
        print(get.....,cmds[1])

    def put(self,cmds):#演示
        print(put.....,cmds[1])

obj = Servers()
obj.run()

结果
>>>>:get a.txt
get..... a.txt
>>>>:put a.txt
put..... a.txt
>>>>:gett a
你的输入错误!
>>>>:

以上就是类的反射的一些基本应用,任何知识都是基本简单,组合难,就看大家如何组合了,后面又想到其他想法,也会再去更新这个

2018.6.18

 

python学习之类的反射(2018.6.18)

标签:用法   mds   命令   als   inpu   country   基本应用   attribute   lex   

原文地址:https://www.cnblogs.com/gbq-dog/p/9196104.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!