2012-08-10 6 views
1

은 데이터 타입이 BarFoo 클래스를 가지고 있습니다. 일반화 된 "기본값"Bar.__init__()을 만들 수 없습니다. Bar 개체는 Foo.__init__() 메서드로 전달됩니다.클래스 객체 데이터 타입 선언하기

파이썬에게이 유형의 datamember를 원한다는 것을 어떻게 알 수 있습니까?


class Foo: 

# These are the other things I've tried, with their errors  
    myBar   # NameError: name 'myBar' is not defined 
    Bar myBar  # Java style: this is invalid Python syntax. 
    myBar = None #Assign "None", assign the real value in __init__. Doesn't work 
##### 

    myBar = Bar(0,0,0) # Pass in "default" values. 
    def __init__(self, theBar): 
     self.myBar = theBar 

    def getBar(self): 
     return self.myBar 

그림과 같이 "기본값"값을 전달할 때 작동합니다. 그러나 getBar으로 전화 할 때 이 아니라이 내가 Foo.__init__() 함수에서 전달한 것을 되돌려받습니다. "기본값"값을 얻습니다. 내가 기대 것 같은


b = Bar(1,2,3) 
f = Foo(b) 
print f.getBar().a, f.getBar().b, f.getBar().c 

이, 하지1 2 30 0 0 뱉어.

myBar 변수를 선언하는 데 신경 쓰지 않으면 getBar(self): 메서드 (Foo instance has no attribute 'myBar')에서 오류가 발생합니다.

내 개체에서 맞춤 datamember를 사용하는 올바른 방법은 무엇입니까?

+2

는 소리. 그 계급은 무엇입니까? –

답변

7

파이썬에게 당신이 특정 데이터 멤버를 추가 할 것이라고 말할 필요는 없습니다. 단지 추가 만하면됩니다. 파이썬은 예를 들어 파이썬보다 동적입니다. 이 점에서 자바.

class Foo: 
    def __init__(self, the_bar=Bar(0,0,0)): 
     self.my_bar = the_bar 

기본값을 uisng 모든 Foo 인스턴스 공유됩니다 bar 인스턴스 (그들은 실제로는 변경되지 않습니다 의미) 본질적으로 불변 인 경우

, 당신은 __init__() 매개 변수의 기본 값으로 기본 인스턴스를 제공 할 수 있습니다 단일 Bar 인스턴스 Bar 인스턴스가 변경 될 수 있다면, 이것은 당신이 원하는 아마, 당신은이 경우이 관용구를 사용한다 : 당신이 일반적으로 파이썬에서 getter 및 setter를 쓰지한다

class Foo: 
    def __init__(self, the_bar=None): 
     if the_bar is None: 
      the_bar = Bar(0,0,0) 
     self.my_bar = the_bar 

참고. 그것들은 불필요한 상용구 코드 일뿐입니다. 파이썬은 프로퍼티를 지원하기 때문에 미래의 프로덕션을 필요로하지 않습니다.

+0

파이썬에서 getters/setter를 사용하지 않는 것에 대해 알지 못했습니다. 감사합니다. – simont

+3

@simont : Python의 Javaism에 대한 자세한 내용은 http://dirtsimple.org/2004/12/python-is-not-java.html을 참조하십시오. –

2

올바른 방법은 생성자에서 할당하는 것 외에는 아무 것도하지 않는 것입니다.

class Foo: 
    def __init__(self, bar):              
     self.bar = bar 

    def getbar(self): 
     return self.bar 
+5

그리고 훨씬 더 정확한 방법은'getbar()'메소드를 전혀 가지지 않는 것입니다. – Duncan

1

변수를 Python으로 선언하지 않으며 변수는 타입 지정되지 않습니다.

그냥 수행

class Foo(object): 
    def __init__(self, bar):              
     self.bar = bar 

    def getbar(self): 
     return self.bar 

나는 문제가 가지 홀수 이전 스타일 클래스를 사용하여 사용자에 의한 것으로 의심. 객체에서 상속 받으면 새로운 스타일의 클래스가 생기고 훨씬 덜 놀랍도록 설계되었습니다.

+0

'new-style'vs 'old-style'클래스는 무엇을 의미합니까 (일부 문서에 대한 링크를 추가 하시겠습니까?). – simont

+1

@simont Python은 오래된 스타일과 새로운 스타일의 클래스를 필요로합니다. 나이 스타일의 반쯤 구운 해킹이 모든 문제를 일으키고 있다는 것이 분명해진 후에 새로운 스타일의 클래스가 추가되었습니다. 귀하의 문서 요청에 따라 언어 참조를 아직 찾지 못했습니다. http://docs.python.org/reference/datamodel.html#new-style-and-classic-classes – Marcin

2

bar을 미리 신고 할 필요가 없습니다.

하나가 지정되지 않은 경우에는이 같은 것을 할 수 있도록 Foo.bar이 값을 기본값으로 할 것 소리

:

class Foo: 
    def __init__(self, bar=None): 
     # one of many ways to construct a new 
     # default Bar if one isn't provided: 
     self._bar = bar if bar else Bar(...) 

    @property 
    def bar(self): 
     """ 
     This isn't necessary but you can provide proper getters and setters 
     if you prefer. 

     """ 
     return self._bar 

    @bar.setter 
    def bar(self, newbar): 
     """ 
     Example of defining a setter 
     """ 
     return self._bar = newbar 

는 일반적으로 단지보다 더 간주됩니다 적절 변수의 이름을 지정하고 세터를 생략을 '파이썬'. 문제가 당신의 바 클래스보다는 푸와처럼

class Foo: 
    def __init__(self, bar=None): 
     self.bar = bar if bar else Bar(...)