相关疑难解决方法(0)

在Python中,你可以调用类A的实例方法,但是传入一个B类的实例吗?

为了重用一些被定义为不同类的实例方法的现有代码,我想要做类似以下的事情:

class Foo(object):
  def __init__(self):
    self.name = "Foo"

  def hello(self):
    print "Hello, I am " + self.name + "."

class Bar(object):
  def __init__(self):
    self.name = "Bar"


bar = Bar()
Foo.hello(bar)
Run Code Online (Sandbox Code Playgroud)

但结果是:

TypeError:必须使用Foo实例作为第一个参数调用未绑定方法hello()(改为使用Bar实例)

这样的事情可能吗?


我应该清楚,我知道这是一个坏主意.显然,真正的解决方案是一些重构.我只是觉得必须有一种方法,事实证明存在.

感谢您的评论.

python oop coding-style

6
推荐指数
2
解决办法
2647
查看次数

如何模拟 celery 任务的绑定上下文

如何模拟绑定上下文,或模拟 celery 任务 ID?

给定一个芹菜任务,如:

帮助者.py:

from task import some_task

def some_helper():
    some_task.delay(123)
Run Code Online (Sandbox Code Playgroud)

在 task.py 中:

@app.task(queue="abc", bind=True)
def some_task(self, some_number: int):
    print(self.id) # how to mock this attribute access?
Run Code Online (Sandbox Code Playgroud)

简单的测试用例:

from django.test.testcases import TestCase
from helpers import some_helper


class SomeTest(TestCase):

    def test_some_helper(self):
        some_helper()
Run Code Online (Sandbox Code Playgroud)

我试过:

 @patch("celery.app.base.Celery.task", return_value=lambda x: x)
Run Code Online (Sandbox Code Playgroud)

我也试过:

class MockResult(dict):
    def __getattr__(self, x):
        return self[x]

...
def test_some_task(self):
    cls = MockResult({"id": "asdf"})
    bound_some_task = some_task.__get__(cls, MockResult)
    bound_some_task(123)
Run Code Online (Sandbox Code Playgroud)

有关的:

django unit-testing celery python-3.x

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

将模块内的所有函数和类导入到python类中

我正在尝试将所有对象从子文件夹导入python 3.8中的类,并在努力寻找一种方法来这样做。我不想手动导入所有对象,因为要列出的文件太多:

class Foo:
    from bar import {
        one,
        two,
        three,
        # ...
    }
Run Code Online (Sandbox Code Playgroud)

当我使用星号导入所有函数和类(例如from bar import *)时,出现以下错误:

SyntaxError: import * only allowed at module level
Run Code Online (Sandbox Code Playgroud)

另外,我也不希望将所有内容放在子作用域下(例如import bar.package,将所有文件放在的package子包中bar),因为函数在运行时bar依赖于传递self,这意味着必须更改selfself.packageI的所有引用仅使用该类中的所有方法创建另一个文件夹,以便没有单个极长的文件。

所以我想我有三个问题:为什么不允许在一个类中全部导入,如何解决这个问题,还有更好的方法将多个方法拆分为不同的文件吗?

编辑:我看过这篇文章是我目前所拥有的,但是我不想使用手动导入所有内容,而是代替了手动导入所有内容*

编辑2:也许创建一个类的子方法作为包并将其作为self导入是可行的(例如import bar.package as self),但这可能会覆盖默认的self。例如说我有两个文件foo.pybar.py

# foo.py
def print_bar(self):
    print("bar")
Run Code Online (Sandbox Code Playgroud)
# bar.py
class Test:
    import foo as self
    def __init__(self):
        print("hi")
        self.one = …
Run Code Online (Sandbox Code Playgroud)

python module class python-import python-3.x

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

Python动态类方法

说有:

class A(B):
    ...
Run Code Online (Sandbox Code Playgroud)

这里B可能是object...不是:

@classmethod # or @staticmethod
def c(cls): print 'Hello from c!'
Run Code Online (Sandbox Code Playgroud)

我不得不做什么叫A.c()不会触发AttributeError

换句话说,我知道可以在运行时手动将类方法添加到类中.但是有可能自动这样做,比如每次缺少类方法时都会创建一些虚拟方法吗?

换句话说,只有我可以A.__dict__用我的dict 替换处理__getitem__- 但A.__dict__似乎不可写......

python runtime class-method

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

创建对象并将用户定义的函数作为方法传递

让我们假设以下情况:我有一个带有一些初始值的类。此外,我想提供一种在初始化新对象时传递用户定义方法的可能性。用户预先了解该类的属性,并且可能希望在函数中考虑它们,例如:

class some_class():
    def __init__(self, some_method):
        # some initial values
        self.a = 8
        self.b = 12
        # initializing a new object with a user-specific method
        self.some_method = some_method 

    def some_method(self):
        pass # this method shall be specified by the user

# user-specific function
def some_function(): 
    return self.a + self.b

some_object = some_class(some_method = some_function)
print(some_object.some_method())
Run Code Online (Sandbox Code Playgroud)

当然,给定的示例不起作用,但是我希望它能说明我想做的事情。我正在寻找一种在类之外定义函数的方法,该函数引用在初始化期间传递对象后的对象属性。

我试图避免的是使用固定名称约定来解决问题,例如:

class some_class():
    def __init__(self, some_method):
        self.a = 8
        self.b = 12
        self.some_method = some_method 

    def some_method(self):
        pass

def some_function(): 
    return some_object.a + some_object.b …
Run Code Online (Sandbox Code Playgroud)

python python-3.x

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