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

时间:2010-01-02 07:08:39

标签: python inheritance

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 个答案:

答案 0 :(得分: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 Mixin   定义所有字典方法   已经有最低限度的课程   字典界面包括    getitem (), setitem (), delitem ()和键()。

     

这个mixin应该用作   超类。添加以上各项   方法逐渐增加   功能。例如,定义   除 delitem ()之外的所有内容都将排除在外   只有pop()和popitem()才能完整   接口

     

除了四种基本方法,   逐步提高效率   定义包含(),    iter ()和iteritems()。

     

由于mixin不知道   子类构造函数,它没有   定义 init ()或copy()。

     

从Python 2.6开始,它   建议使用   collections.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