|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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__ #可查看当前实例对象中所存在的属性和值,以字典形式存在 |
|