python学习之类的反射

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

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

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 获取到一个对象或者类的属性,加()就是执行,看代码spa

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 是修改已有的属性或者是新加一个属性,看代码code

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.学会基本的,仍是须要一些应用才能够,写一个比较的应用,正好也是我在网络编程中须要的,看代码blog

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
你的输入错误!
>>>>:

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

2018.6.18