eval('self.__xxx')为什么不行?

eval('self.__xxx')为什么不行?



[Copy to clipboard] [ - ]
CODE:
from time import time,ctime

class A:
def __init__(self,obj):
  self.__data=obj
  self.__ctime=self.__mtime=self.__atime=time()
def gettime(self,t_type):
  if type(t_type)!=type('') or t_type[0] not in 'cma':
   raise TypeError,"argument of 'c','m',or 'a' req'd"
  else:
   return eval('self.__%stime' % (t_type[0]))

a=A(1)
print ctime(a.gettime('c'))

AttributeError: A instance has no attribute '__ctime'

似乎和eval的实现有关系,不知如何实现我想要的功能?
不知道你想做使用,为什么不使用

setattr() 呢,更直观一些。
想实现的功能
a.gettime('c')得到a.__ctime
a.gettime('m')得到a.__mtime
a.gettime('a')得到a.__atime

网上查到
“注意传递给exec,eval()或evalfile()的代码不会认为调用它们的类的类名是当前类,这与global语句的情况类似,global的作用局限于一起字节编译的代码。同样的限制也适用于getattr() ,setattr()和delattr(),以及直接访问__dict__的时候。”

看来eval无法实现访问类的私有属性
总共就三个值,用个字典存一下返回不是挺方便。简单的事情搞得复杂了。
class A:
        def __init__(self,obj):
          self.__data=obj
          self.__ctime=self.__mtime=self.__atime=time()
        def gettime(self,t_type):
          if type(t_type)!=type('') or t_type[0] not in 'cma':
           raise TypeError,"argument of 'c','m',or 'a' req'd"
          else:
           return eval('self._A__%stime' % (t_type[0]))
如果不想   self._A__%stime' % (t_type[0])
那么可以 使用 str(self)    得到例如:          <__main__.A instance at 0x00913788> 字符串,然后将A解析出来
你提供的例子似乎太抽象了点,不太好维护
还是limoou说的对,
给类加三个属性:ctime创建时间,mtime修改时间,atime访问时间
完整的例子:
a.py

[Copy to clipboard] [ - ]
CODE:
from time import time,ctime

class A:
        def __init__(self,obj):
                self.__data=obj
                self.__ctime=self.__mtime=self.__atime=time()
        def set(self,obj):
                self.__data=obj
                self.__mtime=self.__atime=time()
        def get(self):
                self.__atime=time()
                return self.__data
        def gettimeval(self,t_type):
                if type(t_type)!=type('') or t_type[0] not in 'cma':
                        raise TypeError,"argument of 'c','m',or 'a' req'd"
                else:
                        return eval('self._%s__%stime' % (self.__class__.__name__,t_type[0]))
        def gettimestr(self,t_type):
                return ctime(self.gettimeval(t_type))
        def __repr__(self):
                self.__atime=time()
                return 'self.__data'
        def __str__(self):
                self.__atime=time()
                return str(self.__data)
        def __getattr__(self,attr):
                self.__atime=time()
                return getattr(self.__data,attr)

命令行下
>>>from a import *
>>>a=A(12)
>>>a.gettimestr('c')
>>>a.gettimestr('m')
>>>a.gettimestr('c')
>>>a
>>>a.gettimestr('c')
>>>a.gettimestr('m')
>>>a.gettimestr('c')
>>>a.set('I like it!')
>>a.gettimestr('m')
>>>a
>>>a.gettimestr('c')
>>>a.gettimestr('m')
>>>a.gettimestr('c')

不明白为什么可以这样访问self._A__ctime?是不是属于python的高级话题?
self._A__ctime 是我直接通过dir(a) 看到的, 你最后提供的方法比较好一些, 谢谢!