我需要一些方法来为表单字段的label_tag()方法的输出添加一个类属性.
我看到有能力传入一个attrs字典,我已经在shell中测试了它,我可以做类似的事情:
for field in form:
print field.label_tag(attrs{'class':'Foo'})
Run Code Online (Sandbox Code Playgroud)
我会在输出中看到class ='Foo',但是我没有看到从模板中添加attrs参数的方法 - 实际上,模板是专门针对它设计的,不是吗?
我的表单定义中有一种方法来定义要在标签中显示的类吗?
在表单中,我可以执行以下操作为输入提供类
self.fields['some_field'].widget.attrs['class'] = 'Foo'
Run Code Online (Sandbox Code Playgroud)
我只需要输出它的类.
我有问题覆盖从...使用import语句的方法.举例说明问题:
# a.py module
def print_message(msg):
print(msg)
# b.py module
from a import print_message
def execute():
print_message("Hello")
# c.py module which will be executed
import b
b.execute()
Run Code Online (Sandbox Code Playgroud)
我想在不更改a或b模块中的代码的情况下覆盖print_message(msg)方法.我试过很多方面,但从...导入导入原始方法.当我将代码更改为
import a
a.print_message
Run Code Online (Sandbox Code Playgroud)
比我看到我的变化.
你能建议我如何解决这个问题吗?
提前感谢任何一个小例子.
最好的祝福
------------------更新------------------
我试着这样做,如下所示:
# c.py module
import b
import a
import sys
def new_print_message(msg):
print("New content")
module = sys.modules["a"]
module.print_message = new_print_message
sys.module["a"] = module
Run Code Online (Sandbox Code Playgroud)
但这不适用于我用于... import语句的地方.仅适用于导入,但正如我所写,我不希望在b.py和a.py模块中更改代码.
我希望有人可以回答这个对Python有深刻理解的:)
请考虑以下代码:
>>> class A(object):
... pass
...
>>> def __repr__(self):
... return "A"
...
>>> from types import MethodType
>>> a = A()
>>> a
<__main__.A object at 0x00AC6990>
>>> repr(a)
'<__main__.A object at 0x00AC6990>'
>>> setattr(a, "__repr__", MethodType(__repr__, a, a.__class__))
>>> a
<__main__.A object at 0x00AC6990>
>>> repr(a)
'<__main__.A object at 0x00AC6990>'
>>>
Run Code Online (Sandbox Code Playgroud)
注意repr(a)如何不产生"A"的预期结果?我想知道为什么会这样,如果有办法实现这个目标......
我对比一下,下面的例子可行(也许是因为我们没有尝试覆盖特殊方法?):
>>> class A(object):
... def foo(self):
... return "foo"
...
>>> def bar(self):
... return "bar"
...
>>> from types import …Run Code Online (Sandbox Code Playgroud) 我不太了解python(之前从未使用过它:D),但我似乎无法在网上找到任何东西.也许我只是没有谷歌正确的问题,但在这里我去:
我想更改实例的特定方法的实现.当我用Google搜索它时,我发现你可以这样做,但它改变了同一个类的所有其他实例的实现,例如:
def showyImp(self):
print self.y
class Foo:
def __init__(self):
self.x = "x = 25"
self.y = "y = 4"
def showx(self):
print self.x
def showy(self):
print "y = woohoo"
class Bar:
def __init__(self):
Foo.showy = showyImp
self.foo = Foo()
def show(self):
self.foo.showx()
self.foo.showy()
if __name__ == '__main__':
b = Bar()
b.show()
f = Foo()
f.showx()
f.showy()
Run Code Online (Sandbox Code Playgroud)
这不能按预期工作,因为输出如下:
x = 25
y = 4
x = 25
y = 4
我希望它是:
x = 25
y = 4
x = 25 …
考虑:
class Parent():
def __init__(self, last_name, eye_color):
self.last_name = last_name
self.eye_color = eye_color
def show_info(self):
print("Last Name - "+self.last_name)
print("Eye Color - "+self.eye_color)
billy_cyrus = Parent("Cyrus", "blue")
Run Code Online (Sandbox Code Playgroud)
以上内容来自Udacity Python课程.我发现我能够调用show_info例如billy_cyrus使用下列的:
billy_cyrus.show_info()
Parent.show_info(billy_cyrus)
Run Code Online (Sandbox Code Playgroud)
我很好奇为什么.这两种方法有区别吗?如果是这样的话什么时候会用到另一个呢?如果重要的话,我正在使用Python 3.6.
我最近遇到了Pyodide项目。
我已经使用Pyodide构建了一个小样,但是尽管我花了很多时间来查看源代码,但是对我来说,如何重定向printpython的输出(除了修改CPython源代码之外)还不是很明显(而且)。,如何将输出从matplotlib.pyplot重定向到浏览器。
从源代码来看,FigureCanvasWasm确实有一个show()带有适当后端的方法可以绘制到浏览器画布上-但是,我不清楚如何实例化此类并调用它的show()方法,或者是否还有另一种更明显的重定向方式画到画布上。
因此,我的问题是:
print()消息这是我的测试页:
<!doctype html>
<meta charset="utf-8">
<html lang="en">
<html>
<head>
<title>Demo</title>
<script src="../../pyodide/build/pyodide.js"></script>
</head>
<body>
</body>
<script type="text/javascript">
languagePluginLoader.then(() => {
pyodide.loadPackage(['matplotlib']).then(() => {
pyodide.runPython(`
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4])
plt.ylabel('some numbers')
#fig = plt.gcf()
#fig.savefig(imgdata, format='png')
print('Done from python!')`
);
//var image = pyodide.pyimport('imgdata');
//console.log(image);
});});
</script>
<html>
Run Code Online (Sandbox Code Playgroud) 如何更改实例的__cmp__函数(不在类中)?
例如:
class foo:
def __init__(self, num):
self.num = num
def cmp(self, other):
return self.num - other.num
# Change __cmp__ function in class works
foo.__cmp__ = cmp
a = foo(1)
b = foo(1)
# returns True
a == b
# Change __cmp__ function in instance that way doesnt work
def cmp2(self, other):
return -1
a.__cmp__ = cmp2
b.__cmp__ = cmp2
# Raise error
a == b
#Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
#TypeError: cmp2() …Run Code Online (Sandbox Code Playgroud) 我希望能够以我的django形式提取不同的信息:
这是我的形式:
<form action="" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>
class InstanceForm(ModelForm):
class Meta:
model = models.BaseAsset
widgets = {
'labels': LabelIconCheckboxSelectMultiple()
}
Run Code Online (Sandbox Code Playgroud)
该模型:
class AssetClass(models.Model):
default_labels = models.ManyToManyField(Label, null=True, blank=True)
pass
Run Code Online (Sandbox Code Playgroud)
M2M参考字段
class Label(models.Model):
explanation = models.CharField(null=True, max_length=63)
svgpreview = models.CharField(null=True, max_length=31)
def __unicode__(self):
return unicode(self.explanation)
pass
Run Code Online (Sandbox Code Playgroud)
现在,生成的HTML代码{{ form.as_p }}如下:
<li><label for="id_labels_0"><input type="checkbox" name="labels" value="1" id="id_labels_0" /> Consult owner before using</label></li>
<li><label for="id_labels_1"><input type="checkbox" name="labels" value="2" id="id_labels_1" /> This item is broken</label></li> …Run Code Online (Sandbox Code Playgroud) 我一直在尝试解决第三方模块中的错误。该错误最近已修复,但我一直想知道我的问题。也许这个问题将来会对我或其他人有所帮助。
该模块定义了一个类 Runtime,其中包含我使用的几种方法。导入模块后,它会自动创建一个运行时实例,加载配置并将该实例提供给用户(我)使用。
# thirdPartyModule.py
class Runtime:
def __init__(self, a):
self.a = a
def configuration(self, ...):
...
def fun(self):
print(self.a)
rt = Runtime("twice")
rt.configuration(...)
Run Code Online (Sandbox Code Playgroud)
不幸的是,其中一个运行时方法包含一个错误。我曾经通过用一个工作替代品覆盖实例的方法来修补这个错误,如下所示:
# mycode.py
import types
from thirdPartyModule import rt
def newfun(self):
print(self.a, self.a)
rt.fun = types.MethodType(newfun, rt)
rt.fun()
Run Code Online (Sandbox Code Playgroud)
当我等待开发人员修复错误时,这一切都很好。__slots__或者至少在开发人员添加到类中之前它是这样的:
# thirdPartyModule.py
class Runtime:
__slots__ = ("a", )
def __init__(self, a):
self.a = a
...
Run Code Online (Sandbox Code Playgroud)
从那时起,我在这个论坛上尝试了几种方法覆盖解决方案,但都被拒绝了(“AttributeError:'Runtime'对象属性'fun'是只读的”)。
这可能unittest.mock 可以帮助我,但我对嘲笑不太熟悉。我尝试了以下方法但没有成功:
import unittest.mock
rt.fun = mock.Mock(rt.fun, side_effect=newfun)
Run Code Online (Sandbox Code Playgroud)
这会导致相同的 AttributeError。也许我可以模拟整个实例 ( rt = mock.Mock(rt)) …
python ×8
django ×2
cmp ×1
django-forms ×1
emscripten ×1
forms ×1
matplotlib ×1
methods ×1
newforms ×1
pyodide ×1
slots ×1
webassembly ×1