python学习之类的反射(2018.6.18)

Posted 柴犬砍柴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python学习之类的反射(2018.6.18)相关的知识,希望对你有一定的参考价值。

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

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

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)的主要内容,如果未能解决你的问题,请参考以下文章

pythond对象异常反射的学习笔记

代写编程代写机器学习模型代写AI python

PHP反射之类的反射

Python学习————反射

Python学习心得 反射机制装饰器

Python学习反射机制