我有一个类似于以下的类:
class A {
vector<double> v;
double& x(int i) { return v[2*i]; }
double& y(int i) { return v[2*i+1]; }
double x(int i) const { return v[2*i]; }
double y(int i) const { return v[2*i+1]; }
}
Run Code Online (Sandbox Code Playgroud)
我想让以下Python代码工作:
a = A()
a.x[0] = 4
print a.x[0]
Run Code Online (Sandbox Code Playgroud)
我在想的__setattr__和__getattr__,但如果它的工作原理不清楚.另一种方法是实现以下Python:
a = A()
a['x', 0] = 4
print a['x', 0]
Run Code Online (Sandbox Code Playgroud)
不如前一个好,但可能更容易实现(用__slice__?).
PS.我正在使用sip进行绑定.
谢谢.
我必须自定义__getattr__调用另一个函数来读取.
除了help(object.attr)不起作用之外,这种方法很有效.此代码用于交互式环境,因此help()对我们很重要.
是否有更好的设计来实现相同的功能,但help()运行良好.
我有一个奇怪的表现(对Python程序员)子程序,其简化如下:
use strict;
use Data::Dumper;
sub a {
my @x;
sub b { push @x, 1; print "inside: ", Dumper(\@x); }
&b;
print "outside: ", Dumper(\@x);
}
&a;
&a;
Run Code Online (Sandbox Code Playgroud)
我发现结果是:
inside: $VAR1=[ 1 ]
outside: $VAR1 = [ 1 ]
inside: $VAR1=[1, 1]
outside: $VAR1= []
Run Code Online (Sandbox Code Playgroud)
我还以为是打电话时&a,@x是空数组后" my @x"之后有一个元素" &b",然后死了.我每次打电话&a都是一样的.所以输出应该是全部$VAR1 = [ 1 ].
然后我读了一些像命名子例程在符号表中定义一次,然后我做" my $b = sub { ... }; &$b;",这对我来说似乎有意义.
如何解释?
python ×2
c++ ×1
getattr ×1
perl ×1
pydoc ×1
python-sip ×1
reference ×1
scope ×1
subroutine ×1