相关疑难解决方法(0)

从基类调用重写的方法?

潜入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)

......但这两者似乎都很明显.

我错过了引用中暗示的内容吗?


UPDATE

编辑了在原始代码中调用a.foo()(而不是a.bar())和b.foo()(而不是b.bar())的错字

python

5
推荐指数
2
解决办法
5056
查看次数

具有固定键、值类型的不可变/冻结字典子类

问题

与之前的问题类似,我想创建一个冻结/不可变的字典。具体来说,初始化后,用户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)

python dictionary immutability data-structures python-3.x

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