前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python-----反射

Python-----反射

作者头像
py3study
发布2020-01-16 12:28:21
2860
发布2020-01-16 12:28:21
举报
文章被收录于专栏:python3python3
代码语言:javascript
复制
class Person(object):
    """定义一个人类"""

    def __init__(self, name):
        self.name = name

    def eat(self, food):
        print("%s is eating %s" % (self.name, food))


def talk(self):
    print("%s is yelling..." % self.name)


p = Person("hexingcong")

choice = input(">>>:").strip()
# 运行时,直接输入eat,无法运行,因为choice输入的是字符串格式,无法用p.choice来调用

if hasattr(p, choice):
    # hasattr(p,choice)可以判断Person类中有没有choice这个方法,输入eat,控制台会输出True
    # 输入talk,控制台会输出False

    # delattr(p, choice)是用来删除对象的方法/属性的

    func = getattr(p, choice)
    # getattr(p,choice)得到类中的方法,
    # 一般为其定义一个变量,因为eat这个方法中可能会含有参数然后通过变量来调用
    func("apple")
    # 如果Person类中的eat方法含有参数, 即def eat(self,food),
    # 此处func(food)中就可以了加一个参数food,来传值
else:
    setattr(p, choice, talk)
    func = getattr(p, choice)
    func(p)
    # 如果输入一个talk,而Person中有没有talk()方法,就可以通过setattr来添加方法,
    # 要先在Person类外写一个talk的方法

    # setattr(p, choice, 22)    # "22"可以写成别的
    # getattr(p, choice)
    # print(getattr(p, choice))
    # 如果此时输入name,程序就会报错,因为name属性已经存在
    # 所以就会运行 第20行 ,而name是一个属性,所以不能用func加()来调用


"""
总结------------------------------
    1.hasattr(obj,name_str) 判断一个对象obj里是否有对应的name_str字符串的方法/属性
    2.getattr(obj,name_str) 根据字符串来获取obj对象里对应的方法的内存地址
    3.setattr(obj,name_str,v) is equivalent(等同于) to "obj.name_str = v"
    4.delattr(obj,name_str)删除对象的方法/属性
---------------------------------
"""
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-05-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档