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

python--反射

时间:2019-04-08 21:21:23      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:类型   pre   stat   包含   alt   python   int   tle   ==   

一 . isinstance, type, issubclass 

   isinstance 可以判断该对象是否是XXX家族体系中的(只能往上判断)

技术图片
class Base:
    pass
class Foo(Base):
    pass
class Bar(Foo):
    pass
print(isinstance(Foo(), Foo)) # True
print(isinstance(Foo(), Base)) # True
print(isinstance(Foo(), Bar)) # False
技术图片

  

  type(obj) 表示查看obj是由哪个类创建的.

技术图片
class Boy:
    pass
class Girl:
    pass
# 统计传进来的男生和女生分别有多少
def func(*args):
    b = 0
    g = 0
    for obj in args:
        if type(obj) == Boy:
            b += 1
        elif type(obj) == Girl:
            g += 1
    return b, g
ret = func(Boy(), Girl(), Girl(), Girl())
print(ret)
技术图片

  

  issubclass()这个内置函数可以帮我们判断XXX类是否是YYY类型的子类

技术图片
class Base:
    pass
class Foo(Base):
    pass
class Bar(Foo):
    pass
print(issubclass(Bar, Foo))  # True
print(issubclass(Foo, Bar))  # False
print(issubclass(Bar, Base))  # True
技术图片

二 . 区分函数和方法

技术图片
class Foo:
    def chi(self):
         print("我是吃")
    @staticmethod
    def static_method():
        pass
    @classmethod
    def class_method(cls):
        pass
f = Foo()
print(f.chi) # <bound method Foo.chi of <__main__.Foo object at0x10f688550>>
print(Foo.chi) # <function Foo.chi at 0x10e24a488>
print(Foo.static_method) # <function Foo.static_method at 0x10b5fe620>
print(Foo.class_method) # bound method Foo.class_method of <class‘__main__.Foo‘>>
print(f.static_method) # <function Foo.static_method at 0x10e1c0620>
print(f.class_method) #<bound method Foo.class_method of <class‘__main__.Foo‘>>
技术图片

 

  仔细观察, 我们能得到以下结论: 
    1. 类?法. 不论任何情况, 都是?法. 
    2. 静态?法, 不论任何情况. 都是函数
    3. 实例?法, 如果是实例访问. 就是?法. 如果是类名访问就是函数.

 

  那如何?程序来帮我们分辨. 到底是?法还是函数呢? ?先, 我们要借助于types模块.

技术图片
# 所有的方法都是MethodType的实例
# 所有的函数都是FunctionType的实例
from types import MethodType, FunctionType

def func():
    pass
print(isinstance(func, FunctionType)) # True
print(isinstance(func, MethodType))   # False
技术图片

三 . 反射

技术图片
# great.py文件

def play():
    print(‘篮球打的非常好‘)
def piao():
    print(‘pdd是嫖老师‘)
def money():
    print(‘Jack ma 很有钱‘)
def game():
    print(‘pony ma是做游戏的!‘)
s = ‘哈哈哈‘
技术图片

  

技术图片
# 反射操作

import great  # great是一个写好的py 文件
while 1:
    content = input(‘请输入功能:‘)
    if hasattr(great,content):
        x = getattr(great,content)
        # x() # 如果是函数可以直接调
        print(x, ‘luckly!‘)
    else:
        print(‘非常的不幸‘)
技术图片

 

  补充: 
    关于反射, 其实?共有4个函数: 
    1. hasattr(obj, str) 判断obj中是否包含str成员
    2. getattr(obj,str) 从obj中获取str成员
    3. setattr(obj, str, value) 把obj中的str成员设置成value. 注意. 这?的value可以是值, 也可以是函数或者?法
    4. delattr(obj, str) 把obj
    

 

python--反射

标签:类型   pre   stat   包含   alt   python   int   tle   ==   

原文地址:https://www.cnblogs.com/uiys/p/10673175.html

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