【问题标题】:Passing argument from method using super使用 super 从方法传递参数
【发布时间】:2019-03-25 14:41:01
【问题描述】:

我正在尝试在名为 getphone 的方法下设置参数 role='r'。在 init 下使用 super 工作正常,但我不知道如何在另一种方法下做到这一点

作用是为正在运行的api设置权限级别

此代码正在运行

PATH = 'home_drive_'
PLATFORM = 'Linux_'
ITEM = '_PC'

class Credential:
    def __init__(self, *, path, platform, role='', **kwargs):
        super().__init__(**kwargs)
        self.role = role
        self.username_file = path + platform + role


class AXL(Credential):
    def __init__(self, *, item, **kwargs):
        super().__init__(role='rw', **kwargs)
        self.item = item

    def getphone(self):
        self.role = 'r'
        return self.username_file + self.item

    def writephone(self):
        self.role = 'rw'
        return self.username_file + self.item

    def statusphone(self):
        self.role = 'rwx'
        return self.username_file + self.item

reg1 = AXL(path=PATH, platform=PLATFORM, item=ITEM)

print(reg1.getphone())
print(reg1.writephone())
print(reg1.statusphone())

AXL类下,我想把role='r'移到getphone方法下

我已经尝试过了,它正在工作,但我不明白为什么我需要放置路径和平台。

PATH = 'home_drive_'
PLATFORM = 'Linux_'
ITEM = '_PC'

class Credential:
    def __init__(self, *, path, platform, role='', **kwargs):
        super().__init__(**kwargs)
        self.role = role
        self.username_file = path + platform + role


class AXL(Credential):
    def __init__(self, *, item, **kwargs):
        super().__init__(**kwargs)
        self.item = item

    def getphone(self):
        super().__init__(path=PATH, platform=PLATFORM, role='r')
        return self.username_file + self.item

    def writephone(self):
        super().__init__(path=PATH, platform=PLATFORM, role='rw')
        return self.username_file + self.item

    def statusphone(self):
        super().__init__(path=PATH, platform=PLATFORM, role='rwx')
        return self.username_file + self.item


reg1 = AXL(path=PATH, platform=PLATFORM, item=ITEM)
print(reg1.getphone())
print(reg1.writephone())
print(reg1.statusphone())

可以找到沙盒here

【问题讨论】:

  • 如果我理解正确,你可以在AXL.final里面设置self.role = 'r'
  • 如果我理解正确的话,你不能(至少不能以任何符合约定且易于调试的方式)。 role 是初始化 Credential 实例所必需的,因此必须在初始化 AXL 实例时提供。
  • 不清楚你的最终目标是什么。您想用调用时使用给定角色计算值的方法替换属性username_file(当前在__init__ 中初始化)吗? (这会将role 从实例的属性转换为简单的final 的参数。)
  • 例如,我会有 AXL.getphone、AXL.writephone 和 AXL.statusphone。 getphone 的角色是只读的 (r) writephone 的角色是读/写 (rw) statusphone 的角色是读/写/执行 (rwx) 根据角色,凭据将返回要使用的用户名/密码 谢谢
  • @chepner,这就是我想做的repl.it/@louis_philippedescamps/…

标签: python oop superclass


【解决方案1】:

没有一个角色与实例相关联;相反,角色与实例调用的方法相关联。试试这个。

PATH = 'home_drive_'
PLATFORM = 'Linux_'
ITEM = '_PC'

class Credential:
    def __init__(self, *, path, platform, **kwargs):
        super().__init__(**kwargs)
        self.username_file = path + platform


class AXL(Credential):
    def __init__(self, *, item, **kwargs):
        super().__init__(**kwargs)
        self.item = item

    # "Private" method used to implement the other phone methods
    # You could inline this if you want.
    def _phone(self, role):
        return self.username_file + role + self.item

    def getphone(self):
        return self._phone('r')

    def writephone(self):
        return self._phone('rw')

    def statusphone(self):
        return self._phone('rwx')

reg1 = AXL(path=PATH, platform=PLATFORM, item=ITEM)

print(reg1.getphone())
print(reg1.writephone())
print(reg1.statusphone())

【讨论】:

  • 这行得通,但不确定如何在我复制的真实脚本中使用它here
  • 看起来任何涉及role 的东西都应该是一种使用role 参数即时构建路径的方法,而不是实例的属性。或者,你应该有更多的子类,每个子类确实有一个固定的角​​色。
  • 嗨,像this 那样做怎么样。谢谢
【解决方案2】:

super() 将允许您访问父类范围。您可以在 python3 中以 super().method(args) 的形式从中访问任何方法,在 python 2 中,格式为 super(YourClass,self).method(args)

从 OOP 的角度来看,对每个方法的父级调用 __init__ 似乎并不正确。您将在其生命周期内重新初始化父对象。如果你想从父母那里设置角色,你可以简单地使用self.role = ...。任何访问self.role 的父方法都会看到修改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 2011-07-12
    • 1970-01-01
    相关资源
    最近更新 更多