小编TR.*_*TR.的帖子

为什么Python中的@ foo.setter不适合我?

所以,我正在使用Python 2.6中的装饰器,我在使它们工作时遇到了一些麻烦.这是我的班级文件:

class testDec:

    @property
    def x(self): 
        print 'called getter'
        return self._x

    @x.setter
    def x(self, value): 
        print 'called setter'
        self._x = value
Run Code Online (Sandbox Code Playgroud)

我认为这意味着x像对待财产一样,但是在get和set上调用这些函数.所以,我解雇了IDLE并检查了它:

>>> from testDec import testDec
from testDec import testDec
>>> t = testDec()
t = testDec()
>>> t.x
t.x
called getter
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "testDec.py", line 18, in x
    return self._x
AttributeError: testDec instance has no attribute '_x'
>>> t.x = 5
t.x = 5
>>> …
Run Code Online (Sandbox Code Playgroud)

python decorator new-style-class

153
推荐指数
4
解决办法
7万
查看次数

用于从类中生成新对象的惯用Python

我在我的一个对象上有一个方法,它返回同一个类的新实例.我试图找出最惯用的方法来编写这种方法,以便它生成一个相同类型的新对象,而无需复制代码.

由于此方法使用来自实例的数据,因此我的第一个传递是:

class Foo(object):
    def get_new(self):
        data = # Do interesting things
        return Foo(data)
Run Code Online (Sandbox Code Playgroud)

但是,如果我将Foo子类化并且不覆盖get_new,则在SubFoo上调用get_new将返回Foo!所以,我可以写一个classmethod:

class Foo(object):

    @classmethod
    def get_new(cls, obj):
        data = # Munge about in objects internals
        return cls(data)
Run Code Online (Sandbox Code Playgroud)

但是,我正在访问的数据是特定于对象的,所以它似乎打破了封装,因为它不是一个"正常"(未修饰)的方法.此外,你必须称之为SubFoo.get_new(sub_foo_inst),这似乎是多余的.我希望对象能够"知道"返回哪种类型 - 与自身类型相同!

我想也可以在类中添加一个工厂方法,并在任何地方覆盖返回类型,而不重复逻辑,但这似乎在子类上做了很多工作.

所以,我的问题是,编写一个方法的最佳方法是什么,它提供了类的类型的灵活性,而无需在整个地方注释类型?

python

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

在PHPUnit模拟对象中配置多个方法

我试图在PHP和PHPUnit中创建一个模拟对象.到目前为止,我有这个:

$object = $this->getMock('object',
                         array('set_properties',
                               'get_events'),
                         array(),
                         'object_test',
                         null);

$object
    ->expects($this->once())
    ->method('get_events')
    ->will($this->returnValue(array()));

$mo = new multiple_object($object);
Run Code Online (Sandbox Code Playgroud)

忽略了我那些可怕的不明确的对象名称,我明白我所做的是
- 创建一个模拟对象,配置2个方法,
- 配置'get_events'方法返回一个空白数组,并
- 将模拟放入构造函数.

我现在要做的是配置第二种方法,但我找不到任何解释如何做的事情.我想做点什么

$object
    ->expects($this->once())
    ->method('get_events')
    ->will($this->returnValue(array()))
    ->expects($this->once())
    ->method('set_properties')
    ->with($this->equalTo(array()))
Run Code Online (Sandbox Code Playgroud)

或者其他一些,但这不起作用.我该怎么办?

切线,这是否表明我的代码结构很差,如果我需要配置多个方法来测试?

php phpunit

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

标签 统计

python ×2

decorator ×1

new-style-class ×1

php ×1

phpunit ×1