2010-01-02 32 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

相關問題