为了重用一些被定义为不同类的实例方法的现有代码,我想要做类似以下的事情:
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实例)
这样的事情可能吗?
我应该清楚,我知道这是一个坏主意.显然,真正的解决方案是一些重构.我只是觉得必须有一种方法,事实证明存在.
感谢您的评论.
如何模拟绑定上下文,或模拟 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)
有关的:
我正在尝试将所有对象从子文件夹导入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,这意味着必须更改self对self.packageI的所有引用仅使用该类中的所有方法创建另一个文件夹,以便没有单个极长的文件。
所以我想我有三个问题:为什么不允许在一个类中全部导入,如何解决这个问题,还有更好的方法将多个方法拆分为不同的文件吗?
编辑:我看过这篇文章,这是我目前所拥有的,但是我不想使用手动导入所有内容,而是代替了手动导入所有内容*。
编辑2:也许创建一个类的子方法作为包并将其作为self导入是可行的(例如import bar.package as self),但这可能会覆盖默认的self。例如说我有两个文件foo.py和bar.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) 说有:
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__似乎不可写......
让我们假设以下情况:我有一个带有一些初始值的类。此外,我想提供一种在初始化新对象时传递用户定义方法的可能性。用户预先了解该类的属性,并且可能希望在函数中考虑它们,例如:
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 ×4
python-3.x ×3
celery ×1
class ×1
class-method ×1
coding-style ×1
django ×1
module ×1
oop ×1
runtime ×1
unit-testing ×1