오픈 소스 프로젝트에서 이와 같은 것을 발견했습니다. 인스턴스 속성을 수정하는 메소드는 인스턴스에 대한 참조를 리턴합니다. 이 구성의 목적은 무엇입니까?
class Foo(object):
def __init__(self):
self.myattr = 0
def bar(self):
self.myattr += 1
return self
오픈 소스 프로젝트에서 이와 같은 것을 발견했습니다. 인스턴스 속성을 수정하는 메소드는 인스턴스에 대한 참조를 리턴합니다. 이 구성의 목적은 무엇입니까?
class Foo(object):
def __init__(self):
self.myattr = 0
def bar(self):
self.myattr += 1
return self
답변:
연결을 허용해야합니다.
예를 들면 다음과 같습니다.
var Car = function () {
return {
gas : 0,
miles : 0,
drive : function (d) {
this.miles += d;
this.gas -= d;
return this;
},
fill : function (g) {
this.gas += g;
return this;
},
};
}
이제 당신은 말할 수 있습니다 :
var c = Car();
c.fill(100).drive(50);
c.miles => 50;
c.gas => 50;
@Lie Ryan과 @Frank Shearar가 언급했듯이,이를 "유창한 인터페이스"라고 부르지 만 그 패턴은 정말 오랫동안 존재 해 왔습니다.
그 패턴의 논란의 여지가있는 부분은 OO에서 변경 가능한 상태이므로 void 메소드에는 일종의 묵시적 반환 값이 있습니다 this
. 즉, 업데이트 된 상태의 객체는 일종의 반환 값입니다.
따라서 변경 가능한 상태의 OO 언어에서이 두 가지는 거의 동일합니다.
a.doA()
a.doB()
a.doC()
...와 반대로
a.doA().doB().doC()
그래서 나는 과거의 사람들이 첫 번째 형태를 좋아하기 때문에 유창한 인터페이스에 저항한다고 들었습니다. "유창한 인터페이스"라고 들었던 다른 이름은 "train wreck"입니다.;)
나는 유창한 인터페이스가 주름을 더하기 때문에 "거의 동등하다"라고 말합니다. 그들은 이것을 "반환"할 필요가 없습니다. 그들은 "새로 돌아올 수있다". 그것은 OO에서 불변의 객체를 얻는 방법입니다.
그래서 당신은 클래스 A를 가질 수 있습니다 (의사 코드)
function doA():
return new A(value + 1)
function doB():
return new A(value * 2)
function doC():
return new A(sqrt(value))
이제 각 메소드는 새로운 객체를 반환하고 초기 객체는 변경하지 않습니다. 그리고 이것은 코드에서 크게 변경하지 않고 불변의 객체로 들어가는 방법입니다.
new(...)
하면 메모리가 누출됩니다.
__init__
반복해서 호출하면 오버 헤드가 발생합니다.
대부분의 언어는 '반환 자아'관용구를 알고 있으며, 줄에서 사용되지 않으면 무시합니다. 그러나 파이썬에서는 함수 None
가 기본적으로 반환된다는 점이 주목할 만합니다 .
내가 CS 학교에있을 때 내 강사가 만든 거대한 함수, 프로 시저, 루틴 및 방법의 차이에 대한 거래를; 손에 닿는 에세이 문제는 기계 연필이 내 손에 뜨거워지면서 시작되었습니다.
말할 것도없이 self를 리턴하는 것은 클래스 메소드를 작성하는 결정적인 OO 방법이지만 Python은 다중 리턴 값, 튜플,리스트, 객체, 프리미티브 또는 없음을 허용합니다.
체인화는 마지막 작업에 대한 대답을 다음 작업에 넣는 것 뿐이며 Python 런타임은 이러한 종류의 것을 최적화 할 수 있습니다. 리스트 이해는 이것에 내장 된 형태입니다. (아주 세다!)
따라서 파이썬에서는 모든 메소드 또는 함수가 물건을 반환하는 것이 중요하지 않으므로 기본값은 없음입니다.
프로그램의 모든 행동이 성공, 실패 또는 결과를 호출하는 맥락이나 대상에 다시보고해야하지만 여기에서 국방부 ADA 요구 사항에 대해 이야기하지 않았다고 생각하는 학교가 있습니다. 메소드에서 피드백을 받아야하는 경우 계속 진행하되 일관성을 유지하십시오.
메소드가 실패 할 경우 성공 또는 실패를 리턴하거나 처리 할 예외를 발생시켜야합니다.
한 가지주의 할 점은 리턴 자체 관용구를 사용하면 Python에서 모든 메소드를 변수에 할당 할 수 있으며 실제로 객체를 가져올 때 데이터 결과 또는 목록을 얻는다고 생각할 수 있습니다.
형식 제한 언어는이 작업을 시도 할 때 비명을 지르며 소리를 지르고 끊어 지지만 해석되는 언어 (Python, Lua, Lisp)는 훨씬 더 역동적입니다.
return self
)예:
print(foo.modify1().modify2())
# instaed of
foo.modify1()
foo.modify2()
print(foo)
프로그래밍 커뮤니티에서 더 인기있는 스타일 (제 생각에).
return self
)return
다른 목적으로 사용 하는 능력 .