Chinaunix

标题: 类的挑战 [打印本页]

作者: victorlee129    时间: 2009-03-26 21:34
标题: 类的挑战
最近在写一个很不爽的程序。
要求有一个类:

  1. <some code>
  2. class name(<some object here>):
  3.   def __init__(self<,some others>):
  4.     <some code>
  5.     pass;
  6.   <something>
  7.   def getname(<something>):
  8.     <something>
  9.   def __getattr__(self,name):
  10.     if name=='name' :
  11.       return self.getname()
  12.     else :
  13.       <some code>
  14. abc=name();
  15. print abc.name;
  16. h=name();
  17. print h.name;
  18. x=abc;
  19. print x.name;
复制代码

输出:
abc
h
x
求助。
小鱼版主救救我哈……
QQQ&&BOW

[ 本帖最后由 victorlee129 于 2009-3-26 21:41 编辑 ]
作者: victorlee129    时间: 2009-03-26 21:40
补充:就是要写<>里面的片段……
作者: zhenglxd    时间: 2009-03-27 10:13
原帖由 victorlee129 于 2009-3-26 21:34 发表
最近在写一个很不爽的程序。
要求有一个类:


class name():
  def __init__(self):
   
    pass;
  
  def getname():
   
  def __getattr__(self,name):
    if name=='name' :
      retu ...

前面两个还好说 我没找到提取instance name的方法不过我想是应该有的,不过你把实例名作为参数放在类的变量里也可以的
class name:
  def __init__(self,name):
      self.name=name
      print self.name

i='abc'
exec(i+'=name'+'('+repr(i)+')')

下面的我觉得不可能实现了吧。。。他仅仅是赋值他没有创建新的实例,仅仅是把abc实例后的值赋给x而已
x=abc;
print x.name
作者: izhier    时间: 2009-03-27 11:44
楼上的倒不失为一种解决办法

但有 bugger


  1. class name:
  2.   def __init__(self,name):
  3.       self.name=name

  4. ins1 = name("ins1")
  5. #在此可以 ins1.name == "ins1"

  6. ins2 = ins1
  7. #就不可以了 ins2.name == "ins1"
复制代码

[ 本帖最后由 izhier 于 2009-3-27 11:45 编辑 ]
作者: bohemia    时间: 2009-03-28 00:07
class name:
    def __init__(self):
        pass;
  
    def getname(self):
        import traceback
        s =  traceback.extract_stack()

        import re
        return re.split(r'[\s\=.]+',s[-3][-1].split()[-1])[-2]         


    def __getattr__(self,name):
        if name=='name' :
            return self.getname();
        else :
            return '';

abc=name();
print abc.name;

h=name();
print h.name;

x=abc;
print x.name;




效仿Java的.呵呵. 要根据具体情况调用;
我来抛砖引玉了.

换用正则替换. 解决你遇到的几个BUG.

[ 本帖最后由 bohemia 于 2009-3-28 11:55 编辑 ]
作者: victorlee129    时间: 2009-03-28 09:40
好!
如果不import似乎就不行了?
作者: victorlee129    时间: 2009-03-28 10:35
不对,


  1. class tmp:pass;
  2. x=tmp();
  3. x.t=name();
  4. print x.t.name;
复制代码

输出的是 x 而不是 t
作者: victorlee129    时间: 2009-03-28 10:36
return s[0][-1].split()[-1].split('.')[0]
这一句应该为:
return s[0][-1].split()[-1].split('.')[-2]


作者: victorlee129    时间: 2009-03-28 10:40
!
还有bug!

def testit():
  x=name();
  print x.name;
return s[0][-1].split()[-1].split('.')[-2]
应再改为return s[-3][-1].split()[-1].split('.')[-2]
作者: victorlee129    时间: 2009-03-28 10:56
另一个:我不知道怎么修正的bug:
x=name();
y=x.name;
print y

输出:
y=x;
作者: victorlee129    时间: 2009-03-28 11:04
发个单元测试上来:

  1. import name;
  2. import unittest;
  3. class Knowntest(unittest.TestCase) :
  4.   def testNormally(self):
  5.     '''Normal test'''
  6.     x=name.name();
  7.     self.assertEqual(x.name,'x');
  8.     y=x;
  9.     self.assertEqual(y.name,'y');
  10.     vic=name.name();
  11.     self.assertEqual(vic.name,'vic');
  12.     #Long
  13.     thethingveryveryverylong=name.name();
  14.     self.assertEqual(thethingveryveryverylong.name,'thethingveryveryverylong');
  15.   def testDeep(self):
  16.     class something: pass;
  17.     tmp=something();
  18.     tmp.x=name.name();
  19.     self.assertEqual(tmp.x.name,'x');
  20.     tmp.other=something();
  21.     tmp.other.some=name.name();
  22.     self.assertEqual(tmp.other.some.name,'some');
  23.   def testEqual(self):
  24.     class nothing(str) :
  25.       def __init__(self,value):
  26.         self=value;
  27.       def __lshift__(self,value):
  28.         return self+' is lshifed with '+value;
  29.       def __rshift__(self,value):
  30.         return self+' is rshifed with '+value;
  31.       def __sub__(self,value) :
  32.         return self+' is subed with '+value;
  33.       def __mul__(self,value) :
  34.         return self+' is muled with '+value;
  35.       def __div__(self,value) :
  36.         return self+' is dived with '+value;
  37.       def __mod__(self,value):
  38.         return self+'is moded with'+value;
  39.       def __xor__(self,value):
  40.         return self+'is xored with'+value;
  41.       def __or__(self,value):
  42.         return self+'is ored with'+value;
  43.       def __and__(self,value):
  44.         return self+'is anded with'+value;
  45.     x=name.name()
  46.     a=nothing(x.name);
  47.     self.assertEqual(a,'x');
  48.     y=name.name();
  49.     self.assertEqual(a+y.name,'xy');
  50.     self.assertEqual(a-y.name,'x is subed with y');
  51.     self.assertEqual(a*y.name,'x is muled with y');
  52.     self.assertEqual(a<<y.name,'x is lshifted with y');
  53.     self.assertEqual(a>>y.name,'x is rshifted with y');
  54.     self.assertEqual(a&y.name,'x is anded with y');
  55.     self.assertEqual(a|y.name,'x is ored with y');
  56.     self.assertEqual(a^y.name,'x is xored with y');
  57.     self.assertEqaul(a%y.name,'x is moded with y');
  58.     self.assertEqual(a<<y.name+y.name,'x is lshitfed wiith yy');
  59. if __name__=='__main__':
  60.   import sys;
  61.   sys.argv+=['-v'];
  62.   unittest.main();
复制代码

[ 本帖最后由 victorlee129 于 2009-3-29 16:13 编辑 ]
作者: bohemia    时间: 2009-03-28 11:58
import re
return re.split(r'[\s\=.]+',s[-3][-1].split()[-1])[-2]

这样搞定吧. 原帖子,已经修订.
作者: victorlee129    时间: 2009-03-29 12:14
新的测试。
您的程序又failed了。
作者: bohemia    时间: 2009-03-29 15:15
self.assertEqual(a+y.name,'xy');
    self.assertEqual(a-y.name,'x is subed with y');
    self.assertEqual(a*y.name,'x is muled with y');
    self.assertEqual(a<<y.name,'x is lshifted with y');
    self.assertEqual(a>>y.name,'x is rshifted with y');
    self.assertEqual(a&y.name,'x is anded with y');
    self.assertEqual(a|y.name,'x is ored with y');
    self.assertEqual(a^y.name,'x is xored with y');
    self.assertEqaul(a%y.name,'x is moded with y');

原来是要这样的啊;
那你修改下那个正则搞定吧. 思路是这样. 呵呵.
作者: victorlee129    时间: 2009-03-29 16:13
复合型的怎么办?
如新的测试中最后一个assertEqual
作者: bohemia    时间: 2009-03-29 16:45
是的.你说的是这个意思.
这个是比较难处理; 根据StackTrace跟踪调用,不是个最好的办法.
也许有更好的方式来处理.
作者: victorlee129    时间: 2009-04-02 18:21
事实上,在x.name前面的只可能是
[';',',',']','[','*','/','.','|','<','>','&','^','%','$','@','!','~',+','-']……
能不能想个办法
作者: tensiongyb    时间: 2009-04-03 16:20
标题: 回复 #1 victorlee129 的帖子
此题无解
作者: victorlee129    时间: 2009-04-04 21:47
给出证明原体为NP问题,不然只能说是npc问题。
作者: liukaiyi    时间: 2009-04-08 17:18
不知道是否理解错误
使用
python globals locals 的 map
用 value 来取  key ,也就是 name 就可以啊

[ tmp for tmp in globals().values() if tmp == abc ]
再反过来  得到 key



补充:
晕仔细看了下题目!!
看来 确实理解错了
x=abc ; 还有这个!

我感觉复杂方法!
修改 __new__ 返回的是一个 代理对象,并非真正的本对象 *(可参考 aop python)
在 aop __new__ 结束后 执行 ,得到 新加入的 globals() key 值,放到 name 中

[ 本帖最后由 liukaiyi 于 2009-4-8 17:50 编辑 ]
作者: victorlee129    时间: 2009-04-10 19:15
aop是何方神圣?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2