我试图request.user获取表单的clean方法,但是如何访问请求对象?我可以修改clean方法以允许变量输入吗?
本文有一个片段__bases__,通过向类继承的类的现有类集合添加一个类来动态更改某些Python代码的继承层次结构.好的,这很难读,代码可能更清晰:
class Friendly:
def hello(self):
print 'Hello'
class Person: pass
p = Person()
Person.__bases__ = (Friendly,)
p.hello() # prints "Hello"
Run Code Online (Sandbox Code Playgroud)
也就是说,Person不从Friendly源级别继承,而是通过修改__bases__Person类的属性在运行时动态添加此继承关系.但是,如果您更改Friendly并Person成为新的样式类(通过继承自object),则会收到以下错误:
TypeError: __bases__ assignment: 'Friendly' deallocator differs from 'object'
Run Code Online (Sandbox Code Playgroud)
关于这一点的谷歌搜索似乎表明,在运行时更改继承层次结构时,新样式类和旧样式类之间存在一些不兼容性.具体来说:"新式类对象不支持赋予其基础属性".
我的问题是,是否有可能通过使用__mro__属性使上述Friendly/Person示例在Python 2.7+中使用新式类工作?
免责声明:我完全意识到这是一个模糊的代码.我完全意识到,在实际的生产代码中,这样的技巧往往难以理解,这纯粹是一个思想实验,并且可以让人们了解Python如何处理与多重继承相关的问题.
我在我的python应用程序中使用标准的python日志记录模块:
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("log")
while True:
logger.debug('Stupid log message " + ' '.join([str(i) for i in range(20)]) )
# Do something
问题是,虽然调试级别不启用,那个愚蠢的日志消息是在每次循环迭代,这严重损害了性能评估.
这有什么解决方案吗?
在C++中,我们有log4cxx一个提供这样的宏的包:
LOG4CXX_DEBUG(logger, messasage)
有效地评估为
if (log4cxx::debugEnabled(logger)) {
log4cxx.log(logger,log4cxx::LOG4CXX_DEBUG, message)
}
但是由于Python(AFAIK)中没有宏,是否有一种有效的记录方法?
关于元类,我有些困惑.
class AttributeInitType(object):
def __init__(self,**kwargs):
for name, value in kwargs.items():
setattr(self, name, value)
class Car(AttributeInitType):
def __init__(self,**kwargs):
super(Car, self).__init__(**kwargs)
@property
def description(self):
return "%s %s %s %s" % (self.color, self.year, self.make, self.model)
c = Car(make='Toyota', model='Prius', year=2005, color='green')
print c.description
Run Code Online (Sandbox Code Playgroud)
class AttributeInitType(type):
def __call__(self, *args, **kwargs):
obj = type.__call__(self, *args)
for name, value in kwargs.items():
setattr(obj, name, value)
return obj
class Car(object):
__metaclass__ = AttributeInitType
@property
def description(self):
return "%s %s %s %s" % (self.color, self.year, self.make, self.model) …Run Code Online (Sandbox Code Playgroud) 我正在使用PyDev进行Python应用程序的开发和单元测试.至于单元测试,一切都很好,除了没有内容记录到日志框架.PyDev的"捕获输出"未捕获记录器.
我已经将所有记录到标准输出的内容转发如下:
import sys
logger = logging.getLogger()
logger.level = logging.DEBUG
logger.addHandler(logging.StreamHandler(sys.stdout))
Run Code Online (Sandbox Code Playgroud)
然而,"捕获的输出"不会显示记录到记录器的东西.
这是一个示例unittest-script:test.py
import sys
import unittest
import logging
logger = logging.getLogger()
logger.level = logging.DEBUG
logger.addHandler(logging.StreamHandler(sys.stdout))
class TestCase(unittest.TestCase):
def testSimpleMsg(self):
print("AA")
logging.getLogger().info("BB")
Run Code Online (Sandbox Code Playgroud)
控制台输出是:
Finding files... done.
Importing test modules ... done.
testSimpleMsg (itf.lowlevel.tests.hl7.TestCase) ... AA
2011-09-19 16:48:00,755 - root - INFO - BB
BB
ok
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
Run Code Online (Sandbox Code Playgroud)
但是测试的CAPTURED OUTPUT是:
======================== CAPTURED OUTPUT =========================
AA
Run Code Online (Sandbox Code Playgroud)
有人知道如何捕获logging.Logger在执行此测试期间记录到的所有内容吗?
__len__(self)在Python中实现方法非常容易,因此它可以处理这样的len(inst)调用:
class A(object):
def __len__(self):
return 7
a = A()
len(a) # gives us 7
Run Code Online (Sandbox Code Playgroud)
而且有很多相似的方法,你可以定义(__eq__,__str__,__repr__等).我知道Python类也是对象.
我的问题:我可以以某种方式定义,例如,__len__以便以下工作:
len(A) # makes sense and gives some predictable result
Run Code Online (Sandbox Code Playgroud) 我在编程工作中遇到了一个有趣的案例,要求我在python中实现动态类继承机制.我在使用术语"动态继承"时的意思是一个特别是不从任何基类继承的类,而是选择在实例化时从几个基类之一继承,具体取决于某些参数.
因此,我的问题如下:在我将介绍的情况下,通过动态继承实现所需额外功能的最佳,最标准和"pythonic"方式是什么.
为了以简单的方式总结这个案例,我将举例说明使用两个代表两种不同图像格式的类:'jpg'和'png'图像.然后我将尝试添加支持第三种格式的功能:'gz'图像.我意识到我的问题并不那么简单,但我希望你已经准备好与我一起承担更多的问题了.
此脚本包含两个类:ImageJPG和ImagePNG,都继Image承自基类.要创建图像对象的实例,系统会要求用户image_factory使用文件路径作为唯一参数来调用该函数.
然后,此函数从路径中猜出文件格式(jpg或png),并返回相应类的实例.
两个具体的图像类(ImageJPG和ImagePNG)都能够通过其data属性解码文件.两者都以不同的方式做到这一点.但是,Image为了执行此操作,都要求基类提供文件对象.

import os
#------------------------------------------------------------------------------#
def image_factory(path):
'''Guesses the file format from the file extension
and returns a corresponding image instance.'''
format = os.path.splitext(path)[1][1:]
if format == 'jpg': return ImageJPG(path)
if format == 'png': return ImagePNG(path)
else: raise Exception('The format "' + format + '" is not supported.') …Run Code Online (Sandbox Code Playgroud) 我几乎不知道OOP术语和概念.我从概念上知道对象是什么,对象有方法.我甚至明白在python中,类是对象!那很酷,我只是不知道它意味着什么.它没有点击我.
我目前正在尝试理解一些我认为将阐明我对python的理解的详细答案:
在第一个答案中,作者使用以下代码作为示例:
>>> class Bank(): # let's create a bank, building ATMs
... crisis = False
... def create_atm(self) :
... while not self.crisis :
... yield "$100"
Run Code Online (Sandbox Code Playgroud)
我不会立即弄清楚self指向的是什么.这绝对是不理解类的一个症状,我将在某些时候开展工作.澄清,在
>>> def func():
... for i in range(3):
... print i
Run Code Online (Sandbox Code Playgroud)
我理解i指向列表中的项目range(3),因为它在函数中,不是全局的.但是什么self"指向"?
对于不能以任何其他方式使用的元类,可以做些什么?
亚力理马尔泰利说,如果没有元类,这里有一些任务无法实现Python元类和类装饰器 我想知道哪些是?
要实现可订阅对象很简单,只需__getitem__在此对象的类定义中实现即可.
但是现在我想实现一个可订阅的类.例如,我想实现此代码:
class Fruit(object):
Apple = 0
Pear = 1
Banana = 2
#________________________________
#/ Some other definitions, \
#\ make class 'Fruit' subscriptable. /
# --------------------------------
# \ ^__^
# \ (oo)\_______
# (__)\ )\/\
# ||----w |
# || ||
print Fruit['Apple'], Fruit['Banana']
#Output: 0 2
Run Code Online (Sandbox Code Playgroud)
我知道getattr可以做同样的事情,但我觉得下标访问更优雅.