我想了解内置函数的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
我在使用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)
在上面的代码中,我如何制作一个需要为所有子类实现的抽象方法?
在下面的代码中,我创建了一个基本抽象类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) 我知道PHP或Java的虚拟方法.
它们如何在Python中实现?
或者我要在抽象类中定义一个空方法并覆盖它?
我试图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的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
我的印象str(5)是str在整数上调用函数5.但是当你输入str翻译时:
>>> str
<class 'str'>
Run Code Online (Sandbox Code Playgroud)
所以str实际上是一个类,它使代码if type(a) is str变得更有意义.但是为什么str列在文档中的"内置函数"下呢?这只是一个简化吗?
collections.abc 上的 python 文档有一个很好的汇总表(如下图),其中有一列名为“MixinMethods”。我对本专栏与上一篇专栏之间的差异感到困惑。
是否“抽象方法”可以定制,但“混合方法”有一个特定的实现,在给定类型的所有类中都是固定的?如果是这样,我在哪里可以找到这些 mixin 方法中的内容?
多谢!
我在 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 ×10
python-3.x ×3
decorator ×2
oop ×2
properties ×2
abstract ×1
inheritance ×1
interface ×1
pep8 ×1
python-2.7 ×1
python-2.x ×1