鱼C论坛

 找回密码
 立即注册
查看: 1759|回复: 2

python 关于动态添加属性和值的讨论

[复制链接]
发表于 2020-2-9 17:50:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
最近在网上看了很多关于Python 面向对象的文章,质量可谓参差不齐,也许是国人都钟爱复制粘贴的缘故吧

首先我们来看第一个出现的问题:

import types
class Person(object):
    def __init__(self,newName,newAge):
        self.name = newName
        self.age = newAge
    def eat(self):
        print("...%s正在吃。。"%self.name)   
def run(self):  此处错误
    print("...%s正在跑。。"%self.name)
Wang = Person("laowang",20)
Wang.eat()
Wang.run = types.MethodType(run,Wang)#将run这个函数添加为方法
Wang.run()
这段代码很明显是无法运行的,但是网上像这样的版本数不胜数,其实,错误的关键点在于那个run函数,说真的。第一次见到这么奇怪的写法,脱离类本身还能传self,所以正确的写法应该是

import types


class Person(object):


    def __init__(self,newName,newAge):


        self.name = newName


        self.age = newAge


    def eat(self):


        print("...%s正在吃。。"%self.name)   


def run(object): 只需改为object即可


    print("...%s正在跑。。"%self.name)


Wang = Person("laowang",20)


Wang.eat()


Wang.run = types.MethodType(run,Wang)#将run这个函数添加为方法


Wang.run()
其实动态添加属性方法很多种,最简单的莫过于直接给属性然后赋值 ,就像这样object().a=123

于是乎我自己写了一小段代码自己练练
他实现了输入属性和对应值并达到动态创建属性和值得效果

class er(object):
    aa='awsd'
    def __init__(self):
        super(object,self).__init__()
    def fg(self,tr):
        try:
            if not hasattr(self,tr):
                setattr(self,tr,'value')
                if not isinstance(tr,str):
                    raise ValueError('Warnning:input Error')
                else:
                    getattr(self,tr)
            else:
                print(self.tr)
        except Exception as e:
            print(e)  
    @classmethod
    def gf(cls,val,va):
        try:
            if not hasattr(cls,val,va):
                setattr(cls,val,va)
                if not isinstance(val,str):
                    raise ValueError('Warnning:input Error')
                else:
                    getattr(cls,val)
            else:
                print(cls.val)
        except Exception as e:
            print(e)
pp=er()
#1系统内部生成动态属性和值
pp.fg('asa')
pp.asa='fds' #这里的值可以修改

#2.用户选择生成动态属性和值
ss=input('请输入您要生成的动态属性')
sa=input('请输入您要生成的动态属性的值')
pp.gf(ss,sa)
pp.ss=sa
print('你生成了一个值为',sa,'的',ss,'属性')
pp.__dict__  #可查看当前实例对象中所存在的属性和值,以字典形式存在
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-9 18:02:47 | 显示全部楼层
这样不能运行吧。。self 哪来的

  1. import types


  2. class Person(object):


  3.     def __init__(self,newName,newAge):


  4.         self.name = newName


  5.         self.age = newAge


  6.     def eat(self):


  7.         print("...%s正在吃。。"%self.name)   


  8. def run(object):


  9.     print("...%s正在跑。。"%self.name)    # ???


  10. Wang = Person("laowang",20)


  11. Wang.eat()


  12. Wang.run = types.MethodType(run, Wang)


  13. Wang.run()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-2-9 18:18:05 | 显示全部楼层
zltzlt 发表于 2020-2-9 18:02
这样不能运行吧。。self 哪来的

这个可以运行,上一个不可以
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-22 06:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表