这是C++中访问者模式的一种简化实现。有可能在Python中实现类似的东西吗?
我需要它,因为我将把对象从C++代码传递到Python中的函数。我的想法是在Python中实现一个访问者来找出对象的类型。
<>我的C++代码:#include <iostream>
#include <string>
class t_element_base
{
public:
virtual void accept( class t_visitor &v ) = 0;
};
class t_element_deriv_one: public t_element_base
{
public:
void accept( t_visitor &v );
std::string t_element_deriv_one_text()
{
return "t_element_deriv_one";
}
};
class t_element_deriv_two: public t_element_base
{
public:
void accept( t_visitor &v );
std::string t_element_deriv_two_text()
{
return "t_element_deriv_one";
}
};
class t_visitor
{
public:
void visit( t_element_deriv_one& e ){ std::cout << e.t_element_deriv_one_text() << std::endl; }
void visit( t_element_deriv_two& e ){ std::cout << e.t_element_deriv_two_text() << std::endl; }
};
void t_element_deriv_one::accept( t_visitor &v )
{
v.visit( *this );
}
void t_element_deriv_two::accept( t_visitor &v )
{
v.visit( *this );
}
int
main
(
void
)
{
t_element_base* list[] =
{
new t_element_deriv_one(), new t_element_deriv_two()
};
t_visitor visitor;
for( int i = 0; i < 2; i++ )
list[ i ]->accept( visitor );
}
你可以用装饰工来得到你想要的东西。从这个blog复制示例:
以及@visitor装饰器的代码(以防链接失效):
相关博客(第一个似乎已经关闭):https://chris-lamb.co.uk/posts/visitor-pattern-in-python
编辑:
obj.__qualname__
在Python 3.3之前不可用,因此我们必须对较低版本使用hack:-不幸的是,上述解决方案不适用于3.3以下的python版本,因为方法在传递给decorator时仍然是常规函数。您可以尝试同时使用类和方法装饰器,请参见Can a Python decorator of an instance method access the class?。
visitor模式可以用Python实现,我使用它来实现数据和表示层之间的干净接口。数据层可以确定数据的顺序。而表示层只是打印/格式化它:
在我的数据模块中,我有:
我的所有数据类都继承自这个访问的类,访问的类还公开了一些基本数据的简单函数我的所有对象都需要这些函数,例如名称、父类等,以及管理子列表的方法,这些子列表是由上面使用的
children()
方法公开的。每个子类都将构建自己的数据,拥有自己的属性,甚至可能拥有自己的子类,这些子类将被添加到访问的超级类维护的子列表中。我的访客班是这样的:
_find_data_instance
是一些构建或查找我的一个数据实例的实例的代码。在我的例子中,所有数据类都有一个构造函数,它接受一个objectId
并返回,visitor对象知道要使用什么数据类。你可以在Python中实现这个,但实际上没有必要。Python是一种动态的解释语言,这意味着类型信息在运行时很容易获得。
所以上面的例子可以简单到
这将产生:
相关问题 更多 >
编程相关推荐