菜单

澳门皇家赌场python0八-反射 & 面向对象(1)

2019年4月9日 - 皇家赌场系统

getattr()那一个主意最重点的效益是完毕反射机制。约等于说能够经过字符串获取格局实例。  传入不一样的字符串,调用的章程不均等。

Python中用字符串调用函数或艺术言传身教代码,python示例代码

前言

本文主要给大家介绍了有关Python用字符串调用函数或方式的相干内容,分享出来供我们参考学习,上边来1起看看详细的牵线:

先看三个事例:

>>> def foo():
    print "foo"

>>> def bar():
    print "bar"

>>> func_list = ["foo","bar"]
>>> for func in func_list:
    func()
TypeError: 'str' object is not callable

大家愿意遍历执行列表中的函数,不过从列表中收获的函数名是字符串,所以会提示类型错误,字符串对象是不得以调用的。要是我们想要字符串变成可调用的靶子呢?或是想透过变量调用模块的性质和类的性质呢?

以下有两种办法能够兑现。

eval()

>>> for func in func_list:
    eval(func)()
foo
bar

eval()
平常用来施行贰个字符串表达式,并回到表达式的值。在此处它将字符串转换到对应的函数。eval()
作用强大不过正如危急(eval is evil),不提出使用。

locals()和globals()

>>> for func in func_list:
    locals()[func]()
foo
bar

>>> for func in func_list:
    globals()[func]()
foo
bar

locals() 和 globals()
是python的多少个放置函数,通过它们得以一字典的办法访问片段和全局变量。

getattr()

getattr() 是 python 的内建函数,getattr(object,name) 就相当于object.name,可是此地 name 能够为变量。

返回 foo 模块的 bar 方法

>>> import foo
>>> getattr(foo, 'bar')() 

回到 Foo 类的品质

>>> class Foo:
  def do_foo(self):
    ...

  def do_bar(self):
    ...

>>> f = getattr(foo_instance, 'do_' + opname)
>>> f()

总结

如上就是那篇作品的全体内容了,希望本文的始末对大家的求学或然干活能拉动一定的鼎力相助,就算有疑问大家能够留言沟通,多谢大家对帮客之家的支撑。

参考

Calling a function of a module from a string with the function’s name in
Python

How do I use strings to call functions/methods?

前言
本文首要给大家介绍了有关Python用字符串调用函数或艺术的有关内容,分享…

反射

# 1.创建index.py主程序
# 2.创建commoms模块提供函数
# 3.引入commons模块调用模块中的函数

# commoms.py
def f1():
    print('F1')
    return 'F1'

# index.py
import commons
if __name__ == '__main__':
    ret = commons.f1()
    print(ret) # F1

# index.py
if __name__ == '__main__':
    module = input('请输入模块名:')
    mod = __import__(module)
    # ret = mod.f1() # 正常调用
    # print(ret) # 正常输出
    attr = input('请输入方法名:')
    meth = getattr(mod,attr)
    ret = meth()
    print(ret)

难题聚焦:

原型:getattr(对象,方法名)

据他们说反射模拟web框架路由系统

# 1.创建主程序index.py
# 2.创建功能模块
# 3.截取url,获取里面的地址参数执行不同的方法

# url = input("请输入url:")
url = 'www.yuhhcompany.com/account/login'
regex = 'www.yuhhcompany.com'
ret = re.match(regex, url)
if ret != None:
    # 匹配成功
    host, module, method = url.split('/')
    mod = __import__(module, fromlist=True)
    if hasattr(mod, method):
        ret = getattr(mod, method)()

深谙getattr的应当掌握,getattr(a, ‘b’)的功用就和a.b是同等的

那便是说那一个内建函数有何样效益呢,最有利的实地是使用它来兑现工厂方法(Factory
Method)形式

除此以外,在回调函数里也不时采纳那个函数,对回调了解不深,那里不再举例

 

面向对象

先看一下法定文书档案:

举个栗子:

getattr(object, name[, default])

pyMethod类下定义了八个方法,getattr(pyMethod(),’out%s’%str)()  
传入的方法名区别,调用分裂的法子。些处方法名叫字符串。

Return the value of the named attribute of object. name must be a
string. If the string is the name of one of the object’s attributes, the
result is the value of that attribute. For example, getattr(x, ‘foobar’)
is equivalent to x.foobar. If the named attribute does not exist,
defaultis returned if provided, otherwise AttributeError is raised.

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图