我正在使用Flask构建一个非常小的单页动态网站.我想在不使用类的情况下跨函数共享变量及其值的列表.
我查看了Flask的View类,但是我觉得我的应用程序不够大,也不够复杂,无法使用Flask实现我的项目的基于类的版本.如果我正确说明我也将失去使用route装饰器的能力,并且必须使用其代理功能add_url_rule.
这也会迫使我将我的代码重构为这样的东西:
from flask.views import View
class ShowUsers(View):
def dispatch_request(self):
users = User.query.all()
return render_template('users.html', objects=users)
app.add_url_rule('/users/', view_func=ShowUsers.as_view('show_users'))
Run Code Online (Sandbox Code Playgroud)
对于变量共享,我想到了两种技术.
x = ""
def foo():
global x
x = request.form["fizz"]
def bar():
# do something with x (readable)
print(x)
def baz():
return someMadeupFunction(x)
Run Code Online (Sandbox Code Playgroud)def foo():
x = request.form["fizz"]
qux(someValue)
def qux(i):
menu = {
key0: bar,
key1: baz,
}
menu[i](x)
def bar(x):
# do something with x (readable)
print(x)
def baz(x):
return someMadeupFunction(x)
Run Code Online (Sandbox Code Playgroud)我有一个需要在运行时生成模型的应用程序.
这将根据当前的数据库方案完成.
怎么做到呢?
如何在python中在运行时创建类?
我应该创建一个json表示并将其保存在数据库中,然后将其反序列化为python对象吗?
我想接受一个参数并创建一个名称为参数本身的类。例如,我以“Int”为参数,创建了一个名为“Int”的类,我的类就是这样的。
class Int :
def __init__(self,param) :
self.value = 3
Run Code Online (Sandbox Code Playgroud)
我就是这样做的。
def makeClass( x ) :
return eval( 'class %s :\n def __init__(self,param) :\n self.type = 3'%(x,))
Run Code Online (Sandbox Code Playgroud)
然后打电话
myClass = makeClass('Int')
myInt = myClass(3)
Run Code Online (Sandbox Code Playgroud)
我收到了一个语法错误。请帮忙。
我需要为接口中的每个属性添加一个属性.所以我试图动态修改它来添加它们,但现在还没有取得多大成功.
假设我有以下界面:
class IMember(Interface):
first_name = schema.TextLine(title=u'first name')
last_name = schema.TextLine(title=u'last name')
Run Code Online (Sandbox Code Playgroud)
我想像这样修改它:
class IMember(Interface):
first_name = schema.TextLine(title=u'first name')
last_name = schema.TextLine(title=u'last name')
visbility_first_name = schema.Bool(title=u'Display: first name')
visbility_last_name = schema.Bool(title=u'Display: last name')
Run Code Online (Sandbox Code Playgroud)
我之后尝试修改了类,但由于它已经初始化,因此设置了架构,我不知道如何更改它.我还想过编写一个指令(例如:interface.Implements())但是添加属性似乎很复杂.
我的最终目标是添加一个带有一组Bool小部件的z3c.form字段集.
那么,有没有办法在Python中完成它,或者我是否必须修改界面并手动添加所有属性?
谢谢 !
在Haskell中,种类(类型)允许一些有用的东西,比如类型构造函数.我的问题是,对于各种类型(类型的类型)是否会有任何好处,或者他们可以做什么,只有种类和类型不能轻易完成?
我有20个+ MySQL表,prm_a,prm_b,...有相同的基本结构,但不同的名字,我想不用写每一个用手工将它们与Django的模型类相关联.所以,感到雄心勃勃,我以为我会尝试使用type()作为一个班级工厂:
以下作品:
def get_model_meta_class(prm_name):
class Meta:
app_label = 'myapp'
setattr(Meta, 'db_table', 'prm_%s' % prm_name)
return Meta
prm_class_attrs = {
'foo': models.ForeignKey(Foo),
'val': models.FloatField(),
'err': models.FloatField(blank=True, null=True),
'source': models.ForeignKey(Source),
'__module__': __name__,
}
###
prm_a_attrs = prm_class_attrs.copy()
prm_a_attrs['Meta'] = get_model_meta_class('a')
Prm_a = type('Prm_a', (models.Model,), prm_a_attrs)
prm_b_attrs = prm_class_attrs.copy()
prm_b_attrs['Meta'] = get_model_meta_class('b')
Prm_b = type('Prm_b', (models.Model,), prm_b_attrs)
###
Run Code Online (Sandbox Code Playgroud)
但是如果我尝试生成模型类如下:
###
prms = ['a', 'b']
for prm_name in prms:
prm_class_name = 'Prm_%s' % prm_name
prm_class = type(prm_class_name, …Run Code Online (Sandbox Code Playgroud) 我认为代码比用文字可以更好地解释问题。这是my_abc.py中的代码:
from abc import ABCMeta, abstractmethod
class MyABC(object):
__metaclass__ = ABCMeta
@abstractmethod
def print(self):
pass
Run Code Online (Sandbox Code Playgroud)
这是my_class.py中的代码
from my_abc import MyABC
from third_party_package import SomeClass
class MyClass(MyABC, SomeClass):
def __init__(self):
super(MyClass, self).__init__()
def print(self):
print('Hello ABC')
Run Code Online (Sandbox Code Playgroud)
当我尝试运行my_class.py时,我得到:
TypeError:调用元类基础元类冲突时出错:派生类的元类必须是其所有基础元类的(非严格)子类
我知道我可以创建一个直接从我的接口MyABC继承的类,然后创建另一个类,然后再从我创建的该类和第三方模块类继承。
我的问题是:是否有另一种更好,更适当的方法直接执行此操作,而无需为我的目的创建中间类?
我正在尝试动态添加类属性,但不是在实例级别。例如我可以手动执行以下操作:
class Foo(object):
a = 1
b = 2
c = 3
Run Code Online (Sandbox Code Playgroud)
我希望能够做到:
class Foo(object):
dct = {'a' : 1, 'b' : 2, 'c' : 3}
for key, val in dct.items():
<update the Foo namespace here>
Run Code Online (Sandbox Code Playgroud)
我希望能够做到这一点,而无需从类外部调用该类(因此它是可移植的),或者不需要额外的类/装饰器。这可能吗?
我正在阅读关于元类的这篇有趣的帖子什么是Python中的元类?.接受的答案显示了如何使用具有以下签名的类型创建类.
type(类的名称,父类的元组(用于继承,可以为空),包含属性名称和值的字典)
我尝试使用上面的签名创建"类型"类,我很惊讶我被允许创建一个首先!您的意见表示赞赏!
type = type('type',(),{});
其次,在使用上述语法创建类型类之后,我无法做到
myclass = type('myclass',(),{});
Run Code Online (Sandbox Code Playgroud)
和
type = type('type',(),{});
我说错了
Traceback(最近一次调用last):TypeError中的文件"",第1行:object.new()不带参数
但是,当我尝试以下内容时,我可以成功.
class myclass(object):
pass
Run Code Online (Sandbox Code Playgroud)
我很困惑,根据我的理解,上面的代码片段应该调用类型来尝试创建类'myclass'.发生什么了!?我错过了一些细节吗?
说我有这门课:
class FooClass(object):
foos = ["foo", "bar"]
def do_foos(self):
for foo in self.foos:
print("I have a " + foo)
# ...
Run Code Online (Sandbox Code Playgroud)
我想为这个扩展的类创建一个 SpecialisedFooClass FooClass,将一个项目添加"spec"到foos(即foos包含["foo", "bar", "spec"])。
SpecialisedFooClass.foos应该取决于FooClass.foos:如果我更改FooClass'定义以便foos包含["foo", "bam", "bat"],则SpecialisedFooClass.foos应该包含["foo", "bam", "bat", "spec"]。
这是迄今为止我想出的最好的方法:
class SpecialisedFooClass(FooClass):
foos = FooClass.foos + ["spec"]
Run Code Online (Sandbox Code Playgroud)
但我发现明确提到了FooClass有关。当我决定添加一个中间子类时(即当SpecialisedFooClass' 超类更改时),我将不可避免地忘记更新此引用。事实上,我已经在 IRL 使用我正在处理的代码库中犯了这个错误(实际上并没有处理 foos、bams 和 bats...)。
在我的情况下实际上没有特殊要求foos是类成员而不是实例成员,所以这也可以,但我觉得它很难看。此外,该super调用仍然有一个显式的类引用 …
python ×9
metaclass ×3
django ×2
oop ×2
python-2.7 ×2
attributes ×1
flask ×1
haskell ×1
inheritance ×1
plone ×1
types ×1
urwid ×1