相关疑难解决方法(0)

@property装饰器如何工作?

我想了解内置函数的property工作原理.令我困惑的是,property它也可以用作装饰器,但它只在用作内置函数时才需要参数,而不是用作装饰器时.

这个例子来自文档:

class C(object):
    def __init__(self):
        self._x = None

    def getx(self):
        return self._x
    def setx(self, value):
        self._x = value
    def delx(self):
        del self._x
    x = property(getx, setx, delx, "I'm the 'x' property.")
Run Code Online (Sandbox Code Playgroud)

property的论点是getx,setx,delx和文档字符串.

在下面的代码中property用作装饰器.它的对象是x函数,但在上面的代码中,参数中没有对象函数的位置.

class C(object):
    def __init__(self):
        self._x = None

    @property
    def x(self):
        """I'm the 'x' property."""
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

    @x.deleter
    def x(self):
        del self._x
Run Code Online (Sandbox Code Playgroud)

而且,如何在 …

python properties decorator python-internals python-decorators

889
推荐指数
12
解决办法
46万
查看次数

Python中的抽象方法

我在使用Python继承时遇到了麻烦.虽然这个概念在Java中对我来说似乎太容易了但到目前为止我一直无法理解Python,至少对我来说这是令人惊讶的.

我有一个原型如下:

class Shape():
   def __init__(self, shape_name):
       self.shape = shape_name

class Rectangle(Shape):
   def __init__(self, name):
       self.shape = name
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我如何制作一个需要为所有子类实现的抽象方法?

python inheritance abstract

212
推荐指数
6
解决办法
19万
查看次数

如何在python抽象类中创建抽象属性

在下面的代码中,我创建了一个基本抽象类Base.我希望所有继承的类都Base提供name属性,所以我创建了这个属性@abstractmethod.

然后我创建了一个Base名为的子类Base_1,它旨在提供一些功能,但仍然是抽象的.没有name属性Base_1,但是python会在没有错误的情况下实现该类的对象.如何创建抽象属性?

from abc import ABCMeta, abstractmethod
class Base(object):
    __metaclass__ = ABCMeta
    def __init__(self, strDirConfig):
        self.strDirConfig = strDirConfig

    @abstractmethod
    def _doStuff(self, signals):
        pass

    @property    
    @abstractmethod
    def name(self):
        #this property will be supplied by the inheriting classes
        #individually
        pass


class Base_1(Base):
    __metaclass__ = ABCMeta
    # this class does not provide the name property, should raise an error
    def __init__(self, strDirConfig):
        super(Base_1, self).__init__(strDirConfig)

    def _doStuff(self, signals): …
Run Code Online (Sandbox Code Playgroud)

python abstract-class properties decorator

81
推荐指数
6
解决办法
5万
查看次数

如何在Python中实现虚方法?

我知道PHP或Java的虚拟方法.

它们如何在Python中实现?

或者我要在抽象类中定义一个空方法并覆盖它?

python virtual-functions

69
推荐指数
6
解决办法
7万
查看次数

什么是"针对接口而不是对象的代码"的Python版本?

灵感来自一个很好的问题(和一堆很棒的答案).

语句"针对接口的代码,而不是对象"在Python中是否有任何意义?

我正在寻找像原始问题中的答案,但有Python片段和想法.

python oop interface inversion-of-control

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

Python:抽象类__init__

我试图A用一个默认行为的构造函数声明一个抽象类:所有子类必须初始化一个成员self.n:

from abc import ABCMeta

class A(object):
    __metaclass__ = ABCMeta

    def __init__(self, n):
        self.n = n
Run Code Online (Sandbox Code Playgroud)

但是,我不想让A类被实例化,因为它是一个抽象类.问题是,这实际上是允许的:

a = A(3)
Run Code Online (Sandbox Code Playgroud)

当我期望它应该时,这不会产生任何错误.

那么:如何在为构造函数定义默认行为时定义不可实例化的抽象类?

python oop abstract-class python-2.7

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

能够实例化python类,尽管它是抽象的(使用abc)

这是针对这个问题的答案"使用python的abc模块来创建抽象类".(由@alexvassel作为答案接受).

我尝试了这些建议,但奇怪的是,尽管遵循了使用abc方式的建议,但它对我不起作用.因此我在这里将其作为一个问题发布:

这是我的Python代码:

from abc import ABCMeta, abstractmethod

class Abstract(object):
    __metaclass__ = ABCMeta

    @abstractmethod
    def foo(self):
        print("tst")

a = Abstract()
a.foo()
Run Code Online (Sandbox Code Playgroud)

当我执行这个模块时,这是我控制台上的输出:

pydev debugger: starting (pid: 20388)
tst
Run Code Online (Sandbox Code Playgroud)

而不是那个被接受的答案

>>> TypeError: Can not instantiate abstract class Abstract with abstract methods foo
Run Code Online (Sandbox Code Playgroud)

那我在做什么是对还是错?为什么工作而不是失败?感谢任何专家对此的见解.

python abstract-class python-2.x abstract-base-class python-3.x

6
推荐指数
2
解决办法
1227
查看次数

Python的str()函数实际上不是一个函数?

我的印象str(5)str在整数上调用函数5.但是当你输入str翻译时:

>>> str
<class 'str'>
Run Code Online (Sandbox Code Playgroud)

所以str实际上是一个类,它使代码if type(a) is str变得更有意义.但是为什么str列在文档中的"内置函数"下呢?这只是一个简化吗?

python

4
推荐指数
1
解决办法
163
查看次数

Python 文档中“mixin 方法”的含义

collections.abc 上的 python 文档有一个很好的汇总表(如下图),其中有一列名为“MixinMethods”。我对本专栏与上一篇专栏之间的差异感到困惑。

是否“抽象方法”可以定制,但“混合方法”有一个特定的实现,在给定类型的所有类中都是固定的?如果是这样,我在哪里可以找到这些 mixin 方法中的内容?

在此输入图像描述

多谢!

python abstract-class python-3.x

4
推荐指数
1
解决办法
524
查看次数

在抽象类中使用子方法可以吗?pep8 说实例没有成员

我在 Visual Studio 代码中使用 pep8,我只是尝试编写一些抽象类。

问题是我收到错误,[pylint] E1101:Instance of 'MyAbstract' has no 'child_method' member因为 pep8 没有意识到该方法定义良好,但在子类中。

为了说明我的问题,这里有一个代码片段,为了清晰起见,该代码片段被缩减到最少:

class MyAbstract:

    def some_method(self):
        newinfo = self.child_method()
        # use newinfo 

class MyChild(MyAbstract):

    def child_method(self):
        # Do something in a way

class OtherChild(MyAbstract):

    def child_method(self):
        # Do the same thing in a different way
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

  • 这样写类可以吗?
  • 您将如何解决该错误?(禁用错误,使用另一种模式,...)

澄清

MyAbstract 类不应被实例化,并且子类将继承some_method. 这个想法是在子类实例上使用它。

python abstract-class pep8 python-3.x visual-studio-code

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