2010-01-02 31 views
0
class a(object): 
    w='www' 
    def __init__(self): 
     for i in self.keys(): 
      print i 
    def __iter__(self): 
      for k in self.keys(): 
       yield k 

a() # why is there an error here? 

谢谢。为什么我的班级没有“钥匙”功能?


编辑:下面的类也不扩展任何类; 为什么可以使用keys

class DictMixin: 
    # Mixin defining all dictionary methods for classes that already have 
    # a minimum dictionary interface including getitem, setitem, delitem, 
    # and keys. Without knowledge of the subclass constructor, the mixin 
    # does not define __init__() or copy(). In addition to the four base 
    # methods, progressively more efficiency comes with defining 
    # __contains__(), __iter__(), and iteritems(). 

    # second level definitions support higher levels 
    def __iter__(self): 
     for k in self.keys(): 
      yield k 
    def has_key(self, key): 
     try: 
      value = self[key] 
     except KeyError: 
      return False 
     return True 
    def __contains__(self, key): 
     return self.has_key(key) 

    # third level takes advantage of second level definitions 
    def iteritems(self): 
     for k in self: 
      yield (k, self[k]) 
    def iterkeys(self): 
     return self.__iter__() 

    # fourth level uses definitions from lower levels 
    def itervalues(self): 
     for _, v in self.iteritems(): 
      yield v 
    def values(self): 
     return [v for _, v in self.iteritems()] 
    def items(self): 
     return list(self.iteritems()) 
    def clear(self): 
     for key in self.keys(): 
      del self[key] 
    def setdefault(self, key, default=None): 
     try: 
      return self[key] 
     except KeyError: 
      self[key] = default 
     return default 
    def pop(self, key, *args): 
     if len(args) > 1: 
      raise TypeError, "pop expected at most 2 arguments, got "\ 
           + repr(1 + len(args)) 
     try: 
      value = self[key] 
     except KeyError: 
      if args: 
       return args[0] 
      raise 
     del self[key] 
     return value 
    def popitem(self): 
     try: 
      k, v = self.iteritems().next() 
     except StopIteration: 
      raise KeyError, 'container is empty' 
     del self[k] 
     return (k, v) 
    def update(self, other=None, **kwargs): 
     # Make progressively weaker assumptions about "other" 
     if other is None: 
      pass 
     elif hasattr(other, 'iteritems'): # iteritems saves memory and lookups 
      for k, v in other.iteritems(): 
       self[k] = v 
     elif hasattr(other, 'keys'): 
      for k in other.keys(): 
       self[k] = other[k] 
     else: 
      for k, v in other: 
       self[k] = v 
     if kwargs: 
      self.update(kwargs) 
    def get(self, key, default=None): 
     try: 
      return self[key] 
     except KeyError: 
      return default 
    def __repr__(self): 
     return repr(dict(self.iteritems())) 
    def __cmp__(self, other): 
     if other is None: 
      return 1 
     if isinstance(other, DictMixin): 
      other = dict(other.iteritems()) 
     return cmp(dict(self.iteritems()), other) 
    def __len__(self): 
     return len(self.keys()) 
+1

'A类(对象):',每PEP 8:http://www.python.org/dev/peps/pep-0008/ – bernie 2010-01-02 07:30:57

+0

我已经添加了一个关于迭代对象 – 2010-01-02 08:04:57

回答

3

为什么你会期望它有keys?你没有在你的班级中定义这种方法。你打算从字典中继承吗?

要做到这一点声明类a(dict)

或者,也许你的意思a.__dict__.keys()

至于你已经发布的更新的大片段,再次读取类以上的评论:

# Mixin defining all dictionary methods for classes that already have 
# a minimum dictionary interface including getitem, setitem, delitem, 
# and keys 

注意,“已经有...键”的一部分。

DictMixin类来自UserDict模块,其表示:

类UserDict.DictMixin密新 限定用于 类的所有字典方法已经有一个最小 字典接口包括 的GetItem() (),setitem

这个mixin应该被用作 超类。添加上面的每个 方法都会逐渐增加更多 的功能。例如,定义 只有delitem()将排除 只从完整的 接口pop()和popitem()。

除了四个碱基的方法, 逐渐更多效率自带 与限定包含(), ITER(),和iteritems()。

由于混入没有的 子类构造函数的知识,它不 定义初始化()或复制()。

从Python版本2.6开始,推荐使用 集合。使用MutableMapping代替 DictMixin。

请注意上一部分中的建议 - 使用collections.MutableMapping代替。

遍历对象的属性:

class A(object): 
    def __init__(self): 
     self.myinstatt1 = 'one' 
     self.myinstatt2 = 'two' 
    def mymethod(self): 
     pass 

a = A() 
for attr, value in a.__dict__.iteritems(): 
    print attr, value 
+0

的属性的注释,感谢@ Eli Bendersky,以及我如何使用这个类。 – zjm1126 2010-01-02 07:27:55

+1

谷歌的两秒钟工作发现http://blog.ianbicking.org/2007/08/17/dictmixin/,http://docs.python.org/library/userdict.html和http://snipplr.com/view/6546/Creating-dictionarylike-objects-in-python-using-dictmixin /,所有这些都解释了如何使用DictMixin - 而且这只是知道名称而已。我相信百度可以很容易地为你找到这些网站。 – 2010-01-02 07:34:05

相关问题