Python 为什么我的班级没有';钥匙';功能?

Python 为什么我的班级没有';钥匙';功能?,python,inheritance,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?

谢谢


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

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?

为什么您希望它有
?您没有在类中定义这样的方法。你打算继承一本字典吗

为此,声明类
a(dict)

或者你的意思是
a.\u dict\u.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())
请注意,“已经有…键”部分

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

类UserDict.DictMixin Mixin 定义的所有字典方法 已具有最小值的类 字典接口,包括 getitem()、setitem()、delitem()和keys()

这种混合物应作为一种添加剂使用 超类。添加上述各项 方法会逐渐增加更多 功能。例如,定义 除delitem外的所有文件都将排除 只有完整列表中的pop()和popitem() 接口

除了四种基本方法之外, 效率越来越高 通过定义包含(), iter()和iteritems()

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

从Python版本2.6开始,它 建议使用 collections.MutableMapping而不是 DictMixin

注意最后一部分中的建议-改用
collections.MutableMapping

要迭代对象的属性,请执行以下操作:

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

为什么您希望它有
?您没有在类中定义这样的方法。你打算继承一本字典吗

为此,声明类
a(dict)

或者你的意思是
a.\u dict\u.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())
请注意,“已经有…键”部分

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

类UserDict.DictMixin Mixin 定义的所有字典方法 已具有最小值的类 字典接口,包括 getitem()、setitem()、delitem()和keys()

这种混合物应作为一种添加剂使用 超类。添加上述各项 方法会逐渐增加更多 功能。例如,定义 除delitem外的所有文件都将排除 只有完整列表中的pop()和popitem() 接口

除了四种基本方法之外, 效率越来越高 通过定义包含(), iter()和iteritems()

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

从Python版本2.6开始,它 建议使用 collections.MutableMapping而不是 DictMixin

注意最后一部分中的建议-改用
collections.MutableMapping

要迭代对象的属性,请执行以下操作:

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

class A(object):
,根据PEP 8:我添加了一个关于迭代对象属性的注释
class A(object):
,根据PEP 8:我添加了一个关于迭代对象属性的注释Google found两秒钟的工作,所有这些都解释了如何使用DictMixin-这只知道名称。我相信百度也可以很容易地为你找到这些网站。用谷歌搜索的两秒钟时间,所有这些都解释了如何使用DictMixin,而这只知道它的名字。我相信百度也可以很容易地为你找到这些网站。