2013-10-24 4 views
1

정확하게 묻는 지 확실하지 않지만 모두 알아낼 수있을만큼 똑똑하다는 것을 알고 있습니다. :) 나는 몇몇 파이썬 클래스에서 반복적 인 코드를 압축하는 데 어려움을 겪고있다. 여기에 ... 위Python 클래스 상속 : 동적 속성 생성

class Parent: 

    PATH_PROPERTIES = [ 'parent' ] 

    def __init__(self, path): 
     self.props = { 'parent': path } 

    def getPath(self): 
     return self.props['parent'] 


class Child(Parent): 

    PATH_PROPERTIES = [ 'child' ] 

    def __init__(self, path): 
     self.props = { 'child': path } 

    def getPath(self): 
     return self.props['child'] 

무슨 뜻인지의 예입니다, 현재 상황,하지만 난 ... 같은 뭔가를 수행하여 중복의 일부를 감소하고자하는

class Parent: 
    name = 'parent' 

    PATH_PROPERTIES = [ name ] 

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

    def getPath(self): 
     return self.props[name] 

마지막 코드는 분명히 작동하지 않습니다. 나는 파이썬에서 매크로처럼 C++을 할 수있는 것을 찾을 수 없다. 이 코드를 압축하는 가장 좋은 방법은 무엇입니까?

+0

저는 혼란 스럽습니다. 표준 클래스 속성 (예 :'Child.path')을 사용하지 않는 이유 –

+5

식별자 'parent'' 및'child''를 사전 키로 저장해야하는 이유가 있습니까? 더 많은 컨텍스트가 유용 할 것입니다. – atomicinf

답변

2

당신은 상속 사용할 수 있습니다

class Parent: 

    PATH_PROPERTIES = [ 'parent' ] 

    def __init__(self, path): 
     self.props = { self.PATH_PROPERTIES[0]: path } 

    def getPath(self): 
     return self.props[self.PATH_PROPERTIES[0]] 


class Child(Parent): 

    PATH_PROPERTIES = [ 'child' ]  


c = Child('path') 
print(c.getPath()) 

인쇄 파이썬에서이 getter 기능을 대신 property를 사용하는 것이 바람직하다

path 

참고 :

class Parent: 

    PATH_PROPERTIES = 'parent' 

    def __init__(self, path): 
     self.props = { self.PATH_PROPERTIES: path } 

    @property 
    def path(self): 
     return self.props[self.PATH_PROPERTIES] 


class Child(Parent): 

    PATH_PROPERTIES = 'child'   

c = Child('path') 
print(c.path) 
(210)

또한 c.path가 속성 조회 같다고

path 

주를 인쇄하지만 path는 속성이기 때문에 그것은 @property 장식 기능를 호출 . 구문은 c.getPath()보다 좋지만 동일한 기능을 제공합니다. a decorator to make setters too이 있습니다.

+0

'Child'에'__init__' 메쏘드를 포함 할 필요가 없다는 것에 주목하십시오. 모든 것이 할 일이 있다면, 같은 인자로 부모 클래스 생성자를 호출하는 것입니다. – Blckknght

+0

@Blckknght : 네 말이 맞아. 고맙습니다. – unutbu

1

일반적으로 (unutbu의 답변에서와 같이) 약간의 재 설계로 표준 상속을 통해이 작업을 수행 할 수 있어야하지만 클래스를 생성하기위한 팩토리 함수를 작성할 수 있습니다. 이것은 아마도 매크로와 함께 C++에서 할 수있는 것과 가장 가까운 것일 것입니다 :

def make_class(name, base=object): 

    class Class(base): 

     PATH_PROPERTIES = [name] 

     def __init__(self, path): 
      self.props = {name: path} 

     @property 
     def path(self): 
      return self.props[name] 

    Class.__name__ = name.title() 
    return Class 

Parent = make_class("parent") 
Child = make_class("child", Parent)