小编Ani*_*iol的帖子

为什么没有在[:]上调用__getitem__和__setitem__

我工作的Python 2.7和我试图超载 __getitem__,并__setitem__从继承的类list.

假设我有这个课程:

 class A(list):
    def __getitem__(self, key):
        print "GET!"

   def __setitem__(self, key, value):
        print "SET!"        
Run Code Online (Sandbox Code Playgroud)

用方括号AA.__getitem__应调用.通常情况就是这样,但是当我使用A.__setitem__父实现时,会调用它.为什么?为什么[:]工作?

a = A([1])
a[1] # prints GET!
a["1"] # prints GET!
a[::] # prints GET!
a[slice(None)] # prints GET!
a[:] # returns the list [1]
Run Code Online (Sandbox Code Playgroud)

和以下一样[::]:

a[1] = 2 # prints SET!
a[::] = 2  # prints SET!
a[slice(None)] = 2  # prints SET!
a[:] = [2] …
Run Code Online (Sandbox Code Playgroud)

python list slice python-2.7 python-internals

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

更改继承中构造函数的顺序

我正在努力与类继承建设秩序.假设我有这两个类:

class A {
public:
    const int CONSTANT_A;
    A(const int constant) : CONSTANT_A(constant) {
    }
    void write() {
        std::cout << CONSTANT_A;
    }
};


class B : public A {
public:
    const int CONSTANT_B = 3;
    B() :A(CONSTANT_B) {
        write();
    }
};
Run Code Online (Sandbox Code Playgroud)

B创建新对象时,CONSTANT_A不是3,因为类继承构造函数的顺序如下:

  • 构造总是从基类开始.如果有多个基类,那么它从最左边的基数开始.
  • 然后它转向成员字段.它们按声明的顺序初始化.
  • 在最后,类本身被构造.
  • 析构函数的顺序完全相反.

有没有办法强制成员常量首先初始化?这是最干净的方法吗?

c++ inheritance

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

标签 统计

c++ ×1

inheritance ×1

list ×1

python ×1

python-2.7 ×1

python-internals ×1

slice ×1