我正在开发一个Django项目,我有一个模型模型。
此模型具有其属性,方法和子类。我想迭代并使用" statistics"属性。
所以:
class Model(models.Model):
name = ...
def dont_want(self):
return 'foo'
def want(self):
statistic = True
return self.name
def want_too(self):
statistic = True
return self.name
def get_methods_with_statistic_attribute(self):
# WHAT TO DO
return methods
model = Model(name='Peter')
for method in model.get_methods_with_statistic_attribute():
print method
>>> 'Peter'
>>> 'Peter'
有可能吗?
我试过了:
return [a for a in dir(self) if hasattr(getattr(self,a),'statistic')]
没有成功。
修改
这个问题可以解决我在这里问到的更具体的Django问题:
答案 0 :(得分:1)
这是不可能的,因为在您的示例中,statistic
不是您方法的属性 - 它只是一个仅限于方法范围的变量。换句话说,您的示例不等效于以下内容:
def want(self):
# Some code
return
want.statistics = True
这是事实上的属性创建,其中getattr()
实际上可以正常工作。
那就是说,没有办法得到一个名为statistics
的变量的方法列表。
修改强>
您可能需要定义一个方法列表,您将在代码的某些特定部分调用这些方法。也许一个选择是在模型的常量中定义这些方法。
class Model(models.Model):
name = ...
USEFUL_METHODS = ['want', 'want_too']
def dont_want(self):
return 'foo'
def want(self):
statistic = True
return self.name
def want_too(self):
statistic = True
return self.name
# ...
instance = Model()
for method_str in Model.USEFUL_METHODS:
method = getattr(instance, method_str)
method()
答案 1 :(得分:0)
如果不执行函数并在执行期间检查函数(或查看它的字节码),则无法检查函数的局部变量,但是您可以检查方法本身设置的属性。
我建议装饰者在定义后立即添加 processBuilder = new ProcessBuilder(
Arrays.asList(
"python",
"oc_db5.py",
"-c",
"input.json"));
processBuilder.directory(new File("/opt/jvision/grpc/gui"));
processBuilder.start();
logger.info("Process started ..." + new Date());
int count = 0;
BufferedReader br = new BufferedReader(new InputStreamReader(
process.getInputStream()));
while ((lineData = br.readLine()) != null) {
System.out.println("line: " + ++count + " " + lineData);
logger.info("line: " + ++count + " " + lineData);
}
process.waitFor();
process.getErrorStream();
process.waitFor();
process.exitValue();
属性,以模仿当前设置的逻辑
statistic
然后在函数内部def statistics_method(func):
func.statistic = True
return func
而不是statistic = True
,您可以在定义之前放置@statistics_method
,而您当前拥有的代码也可以使用。