标签: metaprogramming

即使我尝试返回值,__ getattr__也会一直返回None

尝试运行以下代码:

class Test(object):
def func_accepting_args(self,prop,*args):
    msg = "%s getter/setter got called with args %s" % (prop,args)
    print msg #this is prented
    return msg #Why is None returned?

def __getattr__(self,name):
    if name.startswith("get_") or name.startswith("set_"):
        prop = name[4:]
        def return_method(*args):
            self.func_accepting_args(prop,*args)
        return return_method
    else:
        raise AttributeError, name

x = Test()
x.get_prop(50) #will return None, why?!, I was hoping it would return msg from func_accepting_args 
Run Code Online (Sandbox Code Playgroud)

任何人都解释为什么没有返回?

python metaprogramming

1
推荐指数
1
解决办法
144
查看次数

如何在Ruby中为类变量编写writer方法?

我正在研究Ruby,我的大脑只是僵住了.

在下面的代码中,我将如何为'self.total_people'编写类编写器方法?我正在试图"计算"类"Person"的实例数.

    class Person

     attr_accessor :name, :age

 @@nationalities = ['French', 'American', 'Colombian', 'Japanese', 'Russian', 'Peruvian']

 @@current_people = []

 @@total_people = 0

def self.nationalities #reader
   @@nationalities
 end

 def self.nationalities=(array=[]) #writer
   @@nationalities = array
 end

 def self.current_people #reader
   @@current_people
 end

 def self.total_people #reader
   @@total_people
 end

def self.total_people #writer
  #-----?????
end



 def self.create_with_attributes(name, age)
   person = self.new(name)
   person.age = age
   person.name = name
   return person
 end


 def initialize(name="Bob", age=0)
   @name = name
   @age = age
   puts "A new person has been instantiated."
   @@total_people …
Run Code Online (Sandbox Code Playgroud)

ruby oop metaprogramming class

1
推荐指数
1
解决办法
1576
查看次数

我怎么写这个`method_missing`?

我有一个类Wrapper,它支持添加选项,然后您可以查找.它将这些选项存储在内部哈希中@dict.

w = Wrapper.new
w.foo # => NameError
w.foo = 10
w.foo # => 10
Run Code Online (Sandbox Code Playgroud)

如何编写method_missingfor Wrapper以便我可以支持嵌套调用@dict

w = Wrapper.new
w.foo.bar.baz = 1000
w.foo.bar.baz # => 1000
Run Code Online (Sandbox Code Playgroud)

ruby metaprogramming

1
推荐指数
1
解决办法
438
查看次数

Scala:Metaobject的特征

在Scala中,有像java.lang.Class和的metaobjects java.lang.reflect.Method.但是特征存在什么元对象?

class Foo {
  def foo = "foo"
}

var obj = classOf[Foo]

obj // java.lang.Class[Foo] = interface Foo
Run Code Online (Sandbox Code Playgroud)

它打印界面.这是什么?

scala metaprogramming

1
推荐指数
1
解决办法
426
查看次数

Python:如何使用存储在变量中的值来决定要启动哪个类实例?

我正在构建一个Django站点.我需要模拟许多不同的产品类别,如电视,笔记本电脑,女士服装,男鞋等.

由于不同的产品类别具有不同的产品属性,因此每个类别都有自己独立的模型:TV, Laptop, WomensApparel, MensShoes,

对于每个模型,我创建了一个ModelForm.因此我有TVForm, LaptopForm, WomensApparelForm, MensShoesForm,等等

用户可以通过多级下拉框选择产品类别来输入产品详细信息.用户选择产品类别后,我需要显示相应的产品表单.

显而易见的方法是使用一个巨大的if-elif结构:

# category is the product category selected by the user

if category == "TV":
    form = TVForm()
elif category == "Laptop":
    form = LaptopForm()
elif category == "WomensApparel":
    form = WomensApparelForm()
...
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果不是更多类别,可能会有数百个.因此,上述方法容易出错且繁琐.

有没有什么方法可以使用变量的值category直接选择和初始化适当的ModelForm而不诉诸巨大的if-elif声明?

就像是:

# This doesn't work

model_form_name = category + "Form"
form = model_form_name()
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

python django metaprogramming django-models django-forms

1
推荐指数
2
解决办法
171
查看次数

更多Ruby-esque方式来编码这个?

我有一个方法,我打电话过期?这只是为了检查自我的对象更新后是否超过24小时,如果是这样,则返回true.这是我的方法,但虽然它有效但感觉很脏,有人能想出更好的方法来实现我的目标吗?

DAY_IN_SECS = 86400

def expired?
  return true unless (Time.now <=> self.updated_at + DAY_IN_SECS) == -1
end
Run Code Online (Sandbox Code Playgroud)

ruby refactoring metaprogramming ruby-on-rails

1
推荐指数
2
解决办法
370
查看次数

Ruby:将一个方法添加到输入参数的类中

我只是在探索ruby,并且想知道将一个方法添加到对象类的理论可能性.例如,定义一个接受参数的方法,并将方法添加到该参数的类中(而不仅仅是参数对象本身).像这样的例子:

class SomeClass
end

class AnotherClass
end

alpha = SomeClass.new
beta = AnotherClass.new

def AddHelloMethodTo param

 # This is where I'm trying to
 # add a method to the class of the parameter
 def param.class.Hello 
  "Hello"
 end

end

AddHelloMethodTo alpha
AddHelloMethodTo beta

gamma = AnotherClass.new

alpha.Hello
beta.Hello
gamma.Hello
Run Code Online (Sandbox Code Playgroud)

(对不起,如果我有语法错误/错别字我真的很新!)
请注意我怎么不调用AddHelloMethodToon gamma但我希望Hello被定义,因为我把它添加到了类中.
这可能吗?

ruby metaprogramming dynamic

1
推荐指数
1
解决办法
481
查看次数

类型特征不起作用

这个:

cout << std::is_const<const int*>::value; 
Run Code Online (Sandbox Code Playgroud)

打印错误,我认为它应该打印真实.为什么打印错误?

c++ metaprogramming

1
推荐指数
1
解决办法
178
查看次数

C++中的模板工厂模式

我正在尝试创建一个将传入类型的工厂,而不是将其硬编码为类型.但是,当我尝试将类型添加到类型.cpp文件内的工厂时,我将收到链接器错误.例如,他是我目前得到的链接器错误.

1> RandomClass.obj:错误LNK2019:未解析的外部符号"public:short __thiscall TemplatedFactory :: AddType(char const*)"(?? $ AddType @ VRandomClass @@@ TemplatedFactory @@ QAEFPBD @ Z)在函数"void _"中引用cdecl`动态初始化器'私有:静态短的RandomClass :: ID''(void)"(?? _E?ID @ RandomClass @@ 0FA @@ YAXXZ)

我试图让测试用例尽可能小,虽然它确实跨越了五个文件,它们非常小

BaseClass.h:http://codepad.org/MhZMw7t0

#pragma once
class BaseClass{ };
Run Code Online (Sandbox Code Playgroud)

RandomClass.h:http://codepad.org/xoObzP8G

#pragma once
#include "BaseClass.h"
class RandomClass : public BaseClass
{
private:
    static short ID;

public:
    RandomClass();
    virtual ~RandomClass();
};
Run Code Online (Sandbox Code Playgroud)

TemplatedFactory.h:http://codepad.org/qkcTBw24

#pragma once
#include <map>
using std::map;
#include "BaseClass.h"

template<typename Type> BaseClass* createType() { return new …
Run Code Online (Sandbox Code Playgroud)

c++ templates design-patterns metaprogramming factory-pattern

1
推荐指数
1
解决办法
5241
查看次数

生成字符串并在运行时将其作为程序执行

这是一个难以理解的问题,我不确定它的正确用语是什么(如果有的话).我很好奇什么语言允许你在程序执行期间"构建"一个字符串,然后作为程序的一部分执行它.我所知道的唯一一种允许你这样做的语言是Snobol.

然而,阅读Tcl的维基百科条目,听起来它也可以做到这一点?

我一直认为这是一个很好的功能,即使它可能没有太多使用.谢谢.

PS:会用Snobol,Spitbol标记这个,但没有创建新标签的声誉.

programming-languages eval metaprogramming multistage snobol

1
推荐指数
1
解决办法
215
查看次数