两个判断方法 ,反射

目录

两个判断方法

isinstance(a,b)                判断a是否是b类(或者b类的派生类)实例化的对象

issubclass                判断a是否是b类或者b类的派生类

元类:

反射:

反射的方法:

getattr    获取属性或方法 

hasattr   判断属性或方法是否存在     

setattr     设置新的属性  

delattr     删除属性   

对实例化对象的反射:

对类的反射:

对当前模块的反射

对其他模块的反射

反射的小例子:


两个判断方法

isinstance(a,b)                判断a是否是b类(或者b类的派生类)实例化的对象

class A:
    pass

class B(A):
    pass

obj = B()
print(isinstance(obj,B))           #true
print(isinstance(obj,A))           #true
print(isinstance(B,A))             #false

issubclass                判断a是否是b类或者b类的派生类

class A:pass
class B(A):pass
class C(A):pass

b = B()
c = C()

print(issubclass(B,A))      #true
print(issubclass(C,A))       #true
# print(issubclass(b,B))    # TypeError: issubclass() arg 1 must be a class
# print(issubclass(b,A))
# print(issubclass(c,A))

元类:

type()   得到的结果就是 对象的本类

type(object)    返回值是 <class 'type'>

type 去实例化出来这些 类   抽象为 类也是一个对象

type 元类,也叫构建类,产出了Python的大量的内置类 (Object,以及object 的派生类)和 自建类

 

反射:

python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

反射的方法:

getattr    获取属性或方法 

# getattr(a,b)     a指的是 Student 这个类名。   b 指的是  字符串类型值

hasattr   判断属性或方法是否存在     

# hasattr  (a,b)     a指的是 Student 这个类名。   b 指的是  字符串类型

setattr     设置新的属性  

# setattr(类名或对象名,属性名,修改后的属性名或新的属性值)

delattr     删除属性   

# delattr (类名或对象名,被删除的属性名)

对实例化对象的反射:

class Foo:
    f = '类的静态变量'
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def say_hi(self):
        print('hi,%s'%self.name)

obj=Foo('egon',73)

#检测是否含有某属性
print(hasattr(obj,'name'))            
print(hasattr(obj,'say_hi'))  

#获取属性
n=getattr(obj,'name')                 #等同于 obj.name
print(n)
func=getattr(obj,'say_hi')
func()

print(getattr(obj,'aaaaaaaa','不存在啊')) #报错

#设置属性
setattr(obj,'sb',True)                #等同于 obj.sb = True
setattr(obj,'show_name',lambda self:self.name+'sb')
print(obj.__dict__)
print(obj.show_name(obj))

#删除属性
delattr(obj,'age')                    #等同于 del obj.age
delattr(obj,'show_name')
delattr(obj,'show_name111')#不存在,则报错

print(obj.__dict__)

对类的反射:

class Foo(object):
    staticField = "old boy" 
    def __init__(self):
        self.name = 'wupeiqi'
    def func(self):
        return 'func'
    @staticmethod
    def bar():
        return 'bar'
 
print getattr(Foo, 'staticField')
print getattr(Foo, 'func')
print getattr(Foo, 'bar')

对当前模块的反射

import sys

def s1():
    print 's1'
def s2():
    print 's2'
this_module = sys.modules[__name__]  #比较推荐#sys.modules 获得到的是 当前文件的所有属性及方法,返回是一个字典
# 等同于 this.module = sys.modules["__main__"]
hasattr(this_module, 's1')
getattr(this_module, 's2')

对其他模块的反射

"""
程序目录:
    module_test.py
    index.py
"""

#  module_test.py   中的代码
def test():
    print('from the test')

# index.py   中的代码
import module_test as obj
#obj.test()
print(hasattr(obj,'test'))
getattr(obj,'test')()

 

反射的小例子

# 学生登录系统
class User:
    def login(self):
        print('欢迎来到登录页面')
    
    def register(self):
        print('欢迎来到注册页面')
    
    def save(self):
        print('欢迎来到存储页面')

user = User()
while 1:
    choose = input('>>>').strip()
    if hasattr(user,choose):
        func = getattr(user,choose)
        func()
    else:
        print('输入错误。。。。')

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值