访问外部调用方法内部的Python类属性[已关闭]

pkwftd7m  于 2023-04-19  发布在  Python
关注(0)|答案(1)|浏览(99)

已关闭,该问题为opinion-based,目前不接受回答。
**想改进这个问题吗?**更新问题,以便editing this post可以用事实和引用来回答。

5小时前关闭
Improve this question
例如:

class Foo(object):
    def __init(self, x):
        self.var = x

    def loop(self):
        # [yield params]
        result = self.do_sth(params)

    def do_sth(self, params):
        if self.var is not None:
            bar(params)
        if self.var > 1:
            do_other_bar(params)

if __name__ == '__main__':
    foo = Foo(2)

在我的项目中,我有一个由很多方法组成的类,所以我想把do_sth方法移到另一个模块中会很好:

# mymodule.py
def do_sth_external(params, var):
    if var is not None:
        bar()
    if var > 1:
        do_other_bar()
from mymodule import do_sth_external
class Foo(object):
    def __init(x):
        self.var = x

    def loop():
        # [yield params]
        result = do_sth_external(params, self.var)

if __name__ == '__main__':
    foo = Foo(2)

还有什么其他的方法可以分解一个巨大的类呢?我试着将self引用传递给方法,但我认为这更丑陋,特别是如果你把这个原则想象成一个冗长的用例

wgx48brx

wgx48brx1#

不同意或不同意这样拆分类是一个好主意,正确的方法是像往常一样简单地定义方法,并简单地将函数分配给适当的类属性。

class Foo(object):
    def __init(self, x):
        self.var = x

    def loop(self):
        # [yield params]
        result = self.do_sth(params)

    def do_sth(self, params):
        if self.var is not None:
            bar(params)
        if self.var > 1:
            do_other_bar(params)

成为

# Defined here or in another module, it doesn't matter.
# With the exception of the name the function is bound to,
# nothing else has changed.
def foo_do_sth(self, params):
    if self.var is not None:
        bar(params)
    if self.var > 1:
        do_other_bar(params)

class Foo(object):
    def __init(self, x):
        self.var = x

    def loop(self):
        # [yield params]
        result = self.do_sth(params)

    do_sth = foo_do_sth

class语句中的函数定义没有什么特别之处;唯一重要的事情是class语句的命名空间中的 name 被分配一个适当的值。(元类将使用class语句中定义的所有名称来向结果类添加属性,示例方法只不过是一个function值的类属性。)
不时有各种各样的提议允许像

class Foo:
    ...

def Foo.do_sth(self, params):
    ...

以便于在创建类后向类添加方法。这是因为已经可以使用赋值语句,如

def do_sth(self, params):
    ...

Foo.do_sth = do_sth

并且我们认为其他执行赋值的语句也应该能够赋值给属性。

相关问题