免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5303 | 回复: 20
打印 上一主题 下一主题

类的挑战 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-26 21:34 |只看该作者 |倒序浏览
20可用积分
最近在写一个很不爽的程序。
要求有一个类:

  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 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-03-26 21:40 |只看该作者
补充:就是要写<>里面的片段……

论坛徽章:
0
3 [报告]
发表于 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

论坛徽章:
0
4 [报告]
发表于 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 编辑 ]

论坛徽章:
0
5 [报告]
发表于 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 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-03-28 09:40 |只看该作者
好!
如果不import似乎就不行了?

论坛徽章:
0
7 [报告]
发表于 2009-03-28 10:35 |只看该作者
不对,


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

输出的是 x 而不是 t

论坛徽章:
0
8 [报告]
发表于 2009-03-28 10:36 |只看该作者
return s[0][-1].split()[-1].split('.')[0]
这一句应该为:
return s[0][-1].split()[-1].split('.')[-2]

论坛徽章:
0
9 [报告]
发表于 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]

论坛徽章:
0
10 [报告]
发表于 2009-03-28 10:56 |只看该作者
另一个:我不知道怎么修正的bug:
x=name();
y=x.name;
print y

输出:
y=x;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP