首页 > 编程语言 > 详细

python学习——反射

时间:2019-08-21 17:26:05      阅读:114      评论:0      收藏:0      [点我收藏+]
生成器、迭代器、装饰器、列表生成式、面向对象、反射、
1.反射*****
getattr
v = getattr(obj,‘func‘)#根据字符串(第二参数)为参数,去对象(第一参数)中寻找与之同名的成员
2.什么后面可以加()?
类()
对象()--执行__call__
函数()
方法()
以上所有都可以被调用。通过callable()来判断
3.1issubclass
检查第一个参数是否是第二个参数的子孙类

技术分享图片
class Base:
    pass
class Foo(Base):
    pass
class Bar(Foo):
    pass
print(issubclass(Foo,Base))#检查第一个阐述是否是第二个参数的子孙类
print(issubclass(Bar,Base))#检查第一个阐述是否是第二个参数的子孙类
View Code

 



3.2type
获取当前对象是有哪个类创建的
obj = Foo()
print(obj,type(obj))#
if type(obj) == Foo:
   print(obj是Foo类型)
def func(*args):
   foo_counter = 0
   bar_counter = 0
   for item in args:
       if type(item) == Foo:
           foo_counter += 1
       elif type(item) == Bar:
           bar_counter += 1
   return foo_counter,bar_counter
v1,v2 = func(Foo(),Bar(),Foo())
print(v1,v2)

 


3.3isinstance

检查第一个参数(对象)是否是第二个参数(类)的实例
obj = Foo()
print(obj,isinstance(obj,Foo)) #检查第一个参数(对象)是否是第二个参数(类)的实例
print(obj,isinstance(obj,Base)) #检查第一个参数(对象)是否是第二个参数(类)的实例
obj = Base()
print(obj,isinstance(obj,Foo)) #检查第一个参数(对象)是否是第二个参数(类)的实例
print(obj,isinstance(obj,Base)) #检查第一个参数(对象)是否是第二个参数(类)的实例

 


给你一个参数,判断对象是不是由某一个指定类 ————type——type(obj) == Foo
给你一个参数,判断对象是不是由某一个指定类或父类 ————isinstance——isinstance(obj,Foo)

4用科学的方法判断是方法还是函数
def func():
   pass
print(func)

class Foo(object):
   def detail(self):
       pass
   @staticmethod
   def XXX():
      pass

obj = Foo()
print(obj.detail)
print(Foo.XXX)
print(obj.XXX)

 



练习
from types import MethodType,FunctionType
def check(arg):
‘‘‘
  检查arg是方法还是函数
  :param arg:
  :return:
‘‘‘
  if isinstance(arg,MethodType):
      print(arg是一个方法)
  elif isinstance(arg,FunctionType):
      print(arg是一个函数)
  else:
      print(不知道)

def func():
   pass
print(func)

class Foo(object):
  def detail(self):
       pass
   @staticmethod
   def XXX():
      pass

check(func)

obj = Foo()
check(obj.detail)
check(obj.XXX)

 



练习
class Foo(object):
    def f1(self):
        pass
    def f2(self):
        pass
    def f3(self):
        pass
obj = Foo()
Foo.f1(obj)#把f1当做函数
obj = Foo()
obj.f1()#把f1当做方法,自动传self值

 



练习1
class Foo(object):
    def f1(self):
        pass
    def f2(self):
        pass
    def f3(self):
        pass
    list_display = [f1,f2]
    def __init__(self):
        pass
for item in Foo.list_display:
    item(123)#此时是个函数

 



练习2
class Foo(object):
    def f1(self):
        pass
    def f2(self):
        pass
    def f3(self):
        pass
    list_display = [f1,f2]

obj = Foo()
Foo.list_display.append(obj.f3)
for item in Foo.list_display:
    print(item)

 


5.方法和函数*
称谓:
类,方法
外,函数
到底方法函数?
对象.xxx——>xxx就是方法
类.xxx ——>xxx就是函数
xxx ——>xxx就是函数
打印查看:
function
method
代码检查:
from types import MethodType,FunctionType
def check(arg):
    ‘‘‘
    检查arg是方法还是函数
    :param arg:
    :return:
    ‘‘‘
    if isinstance(arg,MethodType):
        print(arg是一个方法)
    elif isinstance(arg,FunctionType):
        print(arg是一个函数)
    else:
        print(不知道)

 
























python学习——反射

原文:https://www.cnblogs.com/bilx/p/11389044.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!