潜入Python -
Python的原作者Guido解释了以这种方式覆盖的方法:"派生类可能会覆盖其基类的方法.因为方法在调用同一对象的其他方法时没有特殊权限,所以基类的方法调用另一种方法在同一个基类中定义的,实际上可能最终调用一个派生类的方法来覆盖它.(对于C++程序员:Python中的所有方法都是虚拟的.)"如果这对你没有意义(它会让人困惑)我的地狱),随意忽略它.我以为我会把它传递给我.
我试图找出一个例子:一个基类的方法调用在同一个基类中定义的另一个方法,实际上可能最终调用一个派生类的方法来覆盖它
class A:
def foo(self): print 'A.foo'
def bar(self): self.foo()
class B(A):
def foo(self): print 'B.foo'
if __name__ == '__main__':
a = A()
a.bar() # echoes A.foo
b = B()
b.bar() # echoes B.foo
Run Code Online (Sandbox Code Playgroud)
......但这两者似乎都很明显.
我错过了引用中暗示的内容吗?
编辑了在原始代码中调用a.foo()(而不是a.bar())和b.foo()(而不是b.bar())的错字
与之前的问题类似,我想创建一个冻结/不可变的字典。具体来说,初始化后,用户ValueError在尝试使用__delitem__和__setitem__方法时应该得到一个 。
与前面的问题不同,我特别希望它成为一个子类,其中初始化类型仅限于特定的键和值类型。
我自己尝试完成此任务collections.UserDict失败了:
class WorkflowParams(UserDict):
def __init__(self, __dict: Mapping[str, str]) -> None:
super().__init__(__dict=__dict)
def __setitem__(self, key: str, item: str) -> None:
raise AttributeError("WorkflowParams is immutable.")
def __delitem__(self, key: str) -> None:
raise AttributeError("WorkflowParams is immutable.")
Run Code Online (Sandbox Code Playgroud)
当尝试使用它时:
workflow_parameters = WorkflowParams(
{
"s3-bucket": "my-big-bucket",
"input-val": "1",
}
)
Run Code Online (Sandbox Code Playgroud)
它失败了
Traceback (most recent call last):
File "examples/python_step/python_step.py", line 38, in <module>
workflow_parameters = WorkflowParams(
File "/home/sean/git/scargo/scargo/core.py", line 14, in __init__ …Run Code Online (Sandbox Code Playgroud)