【问题标题】:Passing class/instance attributes to static methods in Python将类/实例属性传递给 Python 中的静态方法
【发布时间】:2018-03-09 11:49:09
【问题描述】:

将实例/类 (self.something) 的属性传递给同一类的静态方法是否有意义? 没有静态方法的例子:

from intel import i5
from kingston import ddr3
from windows import Prompt


class PC:

    def __init__(self, username, password, cpu, ram):
        self.username = username
        self.password = password
        self.cpu = cpu
        self.ram = ram

    def _log_in(self, login_prompt):
        login_prompt.enter(self.username, self.password)

    def start_up(self):
        # boot_up and do stuff...
        login_prompt = Prompt()
        self._log_in(login_prompt)
        # auto-run applications and do stuff...

静态方法示例:

from intel import i5
from kingston import ddr3
from windows import Prompt


class PC:

    def __init__(self, username, password, cpu, ram):
        self.username = username
        self.password = password
        self.cpu = cpu
        self.ram = ram

    @staticmethod
    def _log_in(login_prompt, username, password):
        login_prompt.enter(username, password)

    def start_up(self):
        # boot_up and do stuff...
        login_prompt = Prompt()
        self._log_in(login_prompt, self.username, self.password)
        # auto-run applications and do stuff...

在这两种情况下,用法是相同的:

my_computer = PC('user', 'password', i5, ddr3)
my_computer.start_up()

【问题讨论】:

  • 你的第一个代码块更容易阅读。
  • 两种实现都是正确的并且功能上是相同的,所以这实际上是一个上下文和个人品味的问题。

标签: python class optimization static-methods


【解决方案1】:

这段代码是错误的

@staticmethod
def _log_in(self, login_prompt, username, password):
    login_prompt.enter(username, password)

静态方法不会收到self,也就是实例。您不会在静态方法中获得对实例的隐式引用。您可以将静态方法视为普通函数,但从实例调用。

如果您不打算公开_log_in,请不要提供参数,而仅在其中使用self

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2019-08-11
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多