相关疑难解决方法(0)

Python类可以通过迭代器和索引访问

可能是一个n00b问题,但我目前有一个实现迭代器的类,所以我可以做类似的事情

for i in class():
Run Code Online (Sandbox Code Playgroud)

但我希望能够通过索引来访问类

class()[1]
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

谢谢!

python iterator list

43
推荐指数
2
解决办法
3万
查看次数

使用抽象基类VS普通继承

我试图了解使用抽象基类的好处.考虑这两段代码:

抽象基类:

from abc import ABCMeta, abstractmethod, abstractproperty

class CanFly:
    __metaclass__ = ABCMeta

    @abstractmethod
    def fly(self):
        pass

    @abstractproperty
    def speed(self):
        pass


class Bird(CanFly):

    def __init__(self):
        self.name = 'flappy'

    @property
    def speed(self):
        return 1

    def fly(self):
        print('fly')


b = Bird()

print(isinstance(b, CanFly))  # True
print(issubclass(Bird, CanFly))  #  True
Run Code Online (Sandbox Code Playgroud)

简单继承:

class CanFly(object):

    def fly(self):
        raise NotImplementedError

    @property
    def speed(self):
        raise NotImplementedError()


class Bird(CanFly):

    @property
    def speed(self):
        return 1

    def fly(self):
        print('fly')


b = Bird()

print(isinstance(b, CanFly))  # True
print(issubclass(Bird, CanFly)) …
Run Code Online (Sandbox Code Playgroud)

python abstract-base-class

7
推荐指数
1
解决办法
534
查看次数

python中抽象类和元类有什么区别?

我读了两篇关于python中元类的文章:

Python 中的元类是什么? http://jakevdp.github.io/blog/2012/12/01/a-primer-on-python-metaclasses/

我阅读了有关 ABC(抽象基类)的信息,该信息显示在:

https://docs.python.org/2/library/abc.html

所以我不得不问:元类和抽象基类(ABC)有什么区别?

据我所知,我可以使用两者来定义元类(元类)的类创建。

我会出于什么目的使用 ABC 或“我自己的”元类?

python abstract-class metaclass

7
推荐指数
0
解决办法
3693
查看次数

Python的super(),抽象基类和NotImplementedError

抽象基类在Python中仍然可以派上用场.在编写一个抽象基类,我希望每个子类都有一个spam()方法,我想写这样的东西:

class Abstract(object):
    def spam(self):
        raise NotImplementedError
Run Code Online (Sandbox Code Playgroud)

挑战还包括想要使用super(),并通过将其包含在整个子类链中来正确地完成.在这种情况下,似乎我必须super包括如下所示的每个调用:

class Useful(Abstract):
    def spam(self):
        try:
            super(Useful, self).spam()
        except NotImplementedError, e:
            pass
        print("It's okay.")
Run Code Online (Sandbox Code Playgroud)

这对于一个简单的子类来说没问题,但是当编写一个有很多方法的类时,try-except会变得有点麻烦,而且有点难看.是否有更优雅的抽象基类子类化方法?我只是做错吗?

python abstract-class super

5
推荐指数
3
解决办法
1万
查看次数

Python:扩展列表的正确方法

我想扩展类"list"的功能并为事件添加自定义处理程序:"将新项目添加到列表"和"从列表中删除项目".对于这个任务,我不想使用组合,更好的是继承.

我尝试做了什么:

class ExtendedList(list):

    def append(self, obj):
        super(ExtendedList, self).append(obj)
        print('Added new item')

    def extend(self, collection):
        if (hasattr(collection, '__iter__') or hasattr(collection, '__getitem__')) and len(collection)>0:
            for item in collection:
                self.append(item)

    def insert(self, index, obj):
        super(ExtendedList, self).insert(index, obj)
        print('Added new item')

    def remove(self, value):
        super(ExtendedList, self).remove(value)
        print('Item removed')
Run Code Online (Sandbox Code Playgroud)

但它无法正常工作.我无法捕捉所有添加和删除事件.例如:

collection = ExtendedList()
collection.append('First item')
# Out: "Added new item\n"; collection now is: ['First item']
collection.extend(['Second item', 'Third item'])
# Out: "Added new item\nAdded new item\n"; collection now is: ['First item', 'Second item', 'Third …
Run Code Online (Sandbox Code Playgroud)

python inheritance list

2
推荐指数
1
解决办法
329
查看次数

实例化抽象类时没有错误,即使没有实现抽象方法

我正在尝试下面的python代码:

from abc import ABCMeta, abstractmethod

class Bar:

    __metaclass__ = ABCMeta

    @abstractmethod
    def foo(self):
        pass


class Bar2(Bar):
    def foo2(self):
        print("Foo2")


b = Bar()
b2 = Bar2()
Run Code Online (Sandbox Code Playgroud)

我认为@abstractmethod确保我的父类是抽象的,子类也是抽象的,因为它没有实现抽象方法.但是在这里,我没有尝试实例化这两个类的错误.

有谁能解释为什么?

python abstract-class abc abstract python-3.x

2
推荐指数
1
解决办法
870
查看次数

Python ABC 接口究竟是如何工作的?

我正在阅读 Luciano Ramalho 写的 Fluent Python 一书,我遇到了以下行:

请注意,内置的具体序列类型实际上并未将所描述的 Sequence 和 MutableSequence 抽象基类 (ABC) 子类化

所以我从 Python 文档中查看了 ABC,但我在理解它们的目的时遇到了问题。

例如,isinstance([], abc.Iterable), 返回True列表,也是如此abc.Sequenceabc.MutableSequence这是有道理的。对于isinstanceissubclass方法,以下内容也是如此。

issubclass(str, abc.MutableSequence) --> False
isinstance((), abc.MutableSequence)  --> False
Run Code Online (Sandbox Code Playgroud)

如果我执行以下操作:

class A:
    def __iter__(self):
        pass

a = A()
isinstance(a, abc.Iterable) # True
issubclass(A, abc.Iterable) # True
Run Code Online (Sandbox Code Playgroud)

但是 Aabc.Iterable在它的类定义中没有子类化(并且,我假设前面提到的其他类也没有,根据这本书)。这些issubclass / isinstance方法和 ABC 接口在这里是如何工作的?这些函数是否只是在类定义中查找 dunder 方法签名并将它们与上述 ABC 类中的 dunder 签名匹配?

除了提供一种验证类是否包含某些特定的 dunder 方法之外,我看不到 ABC 类的任何目的,因此了解更多有关整个过程的目的会很好。

任何形式的帮助将不胜感激。谢谢。

python inheritance abc python-3.x

0
推荐指数
1
解决办法
35
查看次数