2014-12-12 3 views
1

Я смутно помню из моих дней Minecraft модов, что в Java, вы можете установить несколько переменных класса в одной строке, например:Метод цепочки в python, как в java?

SomeBlock.hardness(0.5).isOpaque(True).blastResistance(2).etc.etc 

Ну мне было интересно, если есть способ, чтобы сделать что-то подобное в Python , Я попытался сделать то же самое в python, но второй из них решил, что он должен изменить возврат первого вместо исходного класса.

Есть ли способ сделать это?

+0

Вы имеете в виду метод цепочки? –

+0

@SotiriosDelimanolis Да, я думаю, это то, что было вызвано сейчас, когда вы упомянули об этом. –

+0

Пожалуйста, отредактируйте ваш вопрос, если это так. –

ответ

5

Да, вы можете, на самом деле это делается так же, как это делается на Java: путем возврата ссылки self.

class SomeBlock(object): 
    def hardness(self, blah): 
     self.hardness = blah 
     return self 
    def isOpaque(self, value): 
     self.isOpaque = value 
     return self 

a = SomeBlock() 
a.hardness(0.5).isOpaque(true) 
+0

только половина минуты слишком поздно ...;) – markusw

+2

Следует отметить, однако, что это несколько необычно в Python. Методы, которые изменяют состояние (например, 'append' на объектах списка или' clear' на dicts), обычно не возвращают значение. – iCodez

+1

Да, как-то мне кажется, что для меня, скорее всего, более питонов, чтобы передать тип атрибута-имени, пары значений методу с именем set. Вы могли бы иметь подпись типа set (self, attr, value = None). Если isinstance (attr, dict) вызывает setattr для каждой пары значений ключа. Если нет, вызовите setattr (self, attr value). Единственным недостатком является то, что setattr создаст атрибут, если он не существует. – saulspatz

2

Это просто свободный интерфейс, который, как представляется, должен быть таким. В основном создается путем возврата того же объекта:

class Test: 
    def setX(self, x): 
    self.x = x 
    return self 

    def setY(self, x): 
    self.y = y 
    return self 


t = Test() 
t.setX(12).setY(11) 
0

the second one ends up thinking it is supposed to modify the return of the first one instead of the original class. Да, это обычный синтаксис Python. Возврат self не создает специальный синтаксис. Он просто гарантирует, что возвращаемый объект является правильным для цепочки.

Ваша задача инициализации чаще кодируется как

class SomeBlock(): 
    def __init__(self, hardness=None, opaque=False, blastResistance=None): 
     self.hardness = hardness 
     self.opaque = opaque 
     self.blastResistance = blastResistance 

ablock = SomeBlock(hardness=0.5, opaque=True, blastResistance=2) 

И потому Python не требует методов для доступа атрибутов, вы также можете написать

ablock = SomeBlock() 
ablock.hardness = 0.5 
... 

Таким образом, если метод не возвращать self, это обычно для реализации более сложных атрибутов установки.

Чаще всего метод возвращает новый объект того же класса. Это типично, например, для многих методов массива numpy. A.dot(B) возвращает новый массив, результат принятия точечного произведения A и B. A.dot(B).dot(C) может выглядеть как цепочка, но это всего лишь последовательность действий на последовательных массивах.

Смежные вопросы