面向对象进阶

一:反射

1,python面向对象中的反射就是通过字符串的形式操作对象的相关属性。

2,getattr() 从命名空间中获得这个名字对应的值,找一个属性 ,直接就可以找到这个属性的值,找一个方法 ,找到的是这个方法的内存地址。

3,hasattr() 判断命名空间里有没有这个名字

4,正常情况下如果可以拿到这个变量 那么如有有这个变量的字符串形式 就是用反射可以获取到这个值。

class A:
    role = 'Person'
    def func(self):
        print('*'*self)
ret = input('>>>')
print(A.__dict__[ret])
print(getattr(A,'role'))     
getattr(A,'func')(1)
View Code
class A:
    role = 'Person'
    def func(self):
        print('*'*self)

print(hasattr(A,'r'))
print(hasattr(A,'role'))
print(hasattr(A,'func'))
ret = input('>>>')
if hasattr(A,ret):
    print(getattr(A,ret))     # getattr从A的命名空间里找一个属性 ,属性不存在会报错
if hasattr(A,ret):
    func = getattr(A,ret)
    func(1)
View Code
class A:
    role = 'Person'
    def __init__(self):
        self.money = 500
    def func(self):
        print('*'*10)

a = A()
print(a.func)
getattr(a,'func')()
print(getattr(a,'money'))
View Code
# import time   # 一个py文件就是一个模块
# time.time()
# print(time.time())
# print(getattr(time,'time')())

# import os
# os.rename('userinfo','user')
# getattr(os,'rename')('user','user_info')
模块使用模块中的名字
def login():
    print('执行login功能')

def register():
    print('执行register功能')

import sys  # 和python解释器相关的内容都在sys里
print(sys.modules['__main__'])
func = input('>>>')
if hasattr(sys.modules['__main__'],func):
    getattr(sys.modules['__main__'],func)()
从自己所在的模块中使用自己名字
class A:
    def __init__(self,name):
        self.name = name

    def wahaha(self):
        print('wahahahahaha')

a = A('alex')
#给a对象新增一个属性
#方法一
a.age = 18
print(a.__dict__)
#方法二
setattr(a,'age',18)
print(a.__dict__)
#给a对象修改一个属性
setattr(a,'name','egon')
print(a.__dict__)
#给a对象删除一个属性
#方法一
#del a.age
#方法二
#delattr(a,'age')
增删改对象属性

 

posted @ 2018-04-19 15:39  扬帆起航111  阅读(154)  评论(0编辑  收藏  举报