2016-06-17 2 views
1

그 자체 내에 다른 객체를 보유하고 생성하는 객체를 만들고 싶습니다.파이썬에서 기존 객체 내에 객체 생성하기

class Outer: 
    def __init__(self, name): 
     self.name = name 

    def sayHello(self): 
     print "Hello " + self.name 

    class Inner1: 
     def __init__(self, name): 
      self.name = name 

    class Inner2(Inner1): 
     pass 

    class Inner3(Inner1): 
     pass 
new = outer("new") 

그리고 새로운 요구 내가 new.inner2() 와 그것을 시도 ... inner2 또는 inner3의 목적에 을 만드는하지만 난 결과를 얻을하지는 : 이 같은 외부 클래스와 내부 클래스를 가지고 내가 원하는. 팁이 있습니까?

+3

1. 왜이 중첩 된 않는 클래스를? 2. inner2가 아닌 Inner2라는 이름이 주어지면 왜 new.inner2()를 사용해 보았습니까? – jonrsharpe

+0

이름은 단지 예일뿐입니다. 내가 원하는 개체는 개인이고 사용자가 만들 수 있으며 그 개체는 다른 개체를 만들 수 있어야합니다. 또한 사용자가 제공합니다. 왜냐하면 새로운 객체가 새로운 내부 클래스를 만들기를 원하기 때문입니다. –

+0

나는 당신이 성취하려는 것을 이해하지 못합니다. 컨텍스트를 제공 할 수 있습니까? 실제로 어떤 문제를 해결하려고합니까? 중첩 된 클래스는 파이썬에서는 거의 필요하지 않으며, 지금까지는 코드에 관한 유일한 문제는 다음과 같습니다. 1. 중첩 된 서브 클래스의 본문에서 구문 상 유효하지 않은 '통과'가 없습니다. 2. 올바른 대소 문자를 입력하지 않았습니다. – jonrsharpe

답변

2

다음은 중첩 된 클래스와 중첩 된 인스턴스화를 수행하는 방법입니다. 클래스를 포함 할 때 유형 만 포함합니다. (모든 외부 인스턴스간에 공유 글로벌 내부 인스턴스가 질문을 업데이트하십시오 일을하려고하는 경우.) 당신은 self.__init__

의 인스턴스를 만들 필요는 없습니다

class Outer(object): 

    class Inner1(object): 
     pass 

    class Inner2(Inner1): 
     pass 

    class Inner3(Inner2): 
     pass 

    def __init__(self): 
     self.inner1 = Outer.Inner1() 
     self.inner2 = Outer.Inner2() 
     self.inner3 = Outer.Inner3() 

outer = Outer() 

print outer.inner1 
print outer.inner2 
print outer.inner3 

주 사실에 이것에 대한 중첩 클래스를 사용 - 수업이 클래스의 외부에서 정의 할 수 있으며, 때로는 간단하고 파이썬으로 선호 : 당신은 또한의 패턴을 볼 수

때때로
class Inner1(object): 
    pass 

class Inner2(Inner1): 
    pass 

class Inner3(Inner2): 
    pass 

class Outer(object): 

    def __init__(self): 
     self.inner1 = Inner1() 
     self.inner2 = Inner2() 
     self.inner3 = Inner3() 

outer = Outer() 

print outer.inner1 
print outer.inner2 
print outer.inner3 

...

,
class Inner1(object): 
    pass 

class Outer(object): 
    Inner1 = Inner1 

클래스 내부의 클래스에 대한 "편리한"참조를 만듭니다. 이것은 클래스가 던질 수있는 사용자 정의 예외와 함께 자주 사용됩니다.

Therearemany 중첩 여부에 대한 의견이 다릅니다.

+0

2 "가끔 선호하는"해야 "일반적으로 선호";) –

+1

@AaronTaggart 그래, 그냥 연구하고 있었어! – rrauenza

2

솔직히 내부 클래스는 특히 "포함"클래스 외부에서 인스턴스화하는 경우에는 좋은 생각이 아닙니다.

그러나 당신이 그것이 범위를 참조 할 필요가 있으므로, 기본적으로 내부 클래스는 단지 다른 범위에서 선언 귀하의 질문에 대답합니다.

# Changed to a capitol letter as that is more conventional 
class Outer: 
    name = "" 

    def __init__(self, name): 
     self.name = name 

    def sayHello(self): 
     print ("Hello" + self.name) 

    class Inner1: 
     def __init__(self, name): 
      self.name = name 

    class Inner2(Inner1): 
     pass 

    class Inner3(Inner1): 
     pass 

newOuter = Outer("newOuter") 
newInner2 = Outer.Inner2("newInner2") 
+0

* 정직한 내부 클래스는 일반적으로 좋은 아이디어가 아닙니다. 특히 "포함"클래스 외부에서 선언하는 경우에는 더욱 그렇습니다. * -이 말은 당신이 말하고자했던 것입니까? 무슨 소리 야? – rrauenza

+0

나는 선언하지 않은 것을 의미합니다. :) –

관련 문제