python 학습 노트 6.7 - 데이터 구조의 초기 화 과정 간소화

우 리 는 클래스 를 만 들 때마다 초기 화 함 수 를 만들어 야 합 니 다. 그러면 클래스 를 데이터 구조 로 사용 하면 초기 화 구 조 는 같 습 니 다. 예 를 들 어:
class Stock:
    def __init__(self,name,shares,price):
        self.name = name
        self.shares = shares
        self.price = price

class Point:
    def __init__(self,x,y):
        self.x = x
        self.y = y

class Circle:
    def __init__(self,radius):
        self.radius = radius

각 클래스 마다 데이터 구 조 를 쓰 는 것 이 번 거 롭 습 니 다. 다른 효과 적 인 방법 으로 이러한 번 거 로 움 을 피 할 수 있 습 니 다. 예 를 들 어 데이터 구 조 를 초기 화 하 는 절 차 를 하나의 init () 함수 에 요약 하고 이 를 공공 기본 클래스 에 정의 할 수 있 습 니 다.
class Structure:
    _fields=[]
    def __init__(self,*args):
        if len(args) != len(self._fields):
            raise TypeError('Expected {} arguements'.format(len(self._fields)))
        #set the arguments
        for name, value in zip(self._fields,args):
            setattr(self,name,value)

class Stock(Structure):
    _fields = ['name','shares','prices']
s = Stock('ACER',50,99)
print(s.name,s.shares,s.prices)

class Point(Structure):
    _fields = ['x','y']
p = Point(4,5)
print(p.x,p.y)

    :
ACER 50 99
4 5

이렇게 하면 우 리 는 각종 Structure 기반 클래스 를 계속 만 들 수 있 고 편리 하고 빠르다.본질 적 으로 이런 방법 은 유형의 계승 을 잘 이용 했다.위의 방법 을 보완 할 수 있 고 키워드 파라미터 에 대한 지원 을 추가 할 수 있 습 니 다. 이렇게 하면 표현 이 더욱 뚜렷 하고 프로 그래 밍 이 편리 합 니 다. 가장 좋 은 선택 은 키워드 파 라 메 터 를 매 핑 하 는 것 입 니 다. 그러면 그들 은 - field 에 정 의 된 속성 명 에 만 대응 할 수 있 습 니 다.
class Structure:
    _fields=[]
    def __init__(self,*args,**kwargs):
        if len(args) > len(self._fields):
            raise TypeError('Expected {} arguments'.format(len(self._fields)))
        #set the arguments
        for name, value in zip(self._fields,args):
            setattr(self,name,value)
        for name in self._fields[len(args):]:
            setattr(self,name,kwargs.pop(name))
        if kwargs:
            raise TypeError('Invided arguments : {}'.format(','.join(kwargs)))

class Stock(Structure):
    _fields = ['name','shares','prices']
s = Stock('ACER',50,prices=99)
print(s.name,s.shares,s.prices)

class Point(Structure):
    _fields = ['x','y']
p = Point(x=4,y=5)
print(p.x,p.y)

    :
ACER 50 99
4 5

또한 키워드 파 라 메 터 를 이용 하여 클래스 에 추가 속성 을 추가 할 수 있 으 며, 이러한 추가 속성 은 에 정의 되 지 않 았 습 니 다.fields 의:
class Structure:
    _fields=[]
    def __init__(self,*args,**kwargs):
        if len(args) > len(self._fields):
            raise TypeError('Expected {} arguments'.format(len(self._fields)))
        #set the arguments
        for name, value in zip(self._fields,args):
            setattr(self,name,value)
        for name in self._fields[len(args):]:
            setattr(self, name, kwargs.pop(name))
        extra_args = kwargs.keys() - self._fields
        for name in extra_args:
            setattr(self,name,kwargs.pop(name))
        if kwargs:
            raise TypeError('Invided arguments : {}'.format(','.join(kwargs)))

class Stock(Structure):
    _fields = ['name','shares','prices']
s = Stock('ACER',50,prices = 99,date = '2012-2-2')
print(s.name,s.shares,s.prices,s.date)

class Point(Structure):
    _fields = ['x','y']
p = Point(4,5)
print(p.x,p.y)

예시 에서 알 수 있 듯 이 우 리 는 모두 setattr () 함 수 를 사용 하여 전 달 된 속성 파 라미 터 를 대응 하 는 속성 에 추가 합 니 다.이와 달리 예제 사전 에 직접 접근 하 는 방법 으로 속성 을 추가 할 수도 있다.
class Structure:
    _fields=[]
    def __init__(self,*args,**kwargs):
        if len(args) > len(self._fields):
            raise TypeError('Expected {} arguments'.format(len(self._fields)))
        #set the arguments
        self.__dict__.update(zip(self._fields,args))

class Stock(Structure):
    _fields = ['name','shares','prices']
s = Stock('ACER',50,99)
print(s.name,s.shares,s.prices)

class Point(Structure):
    _fields = ['x','y']
p = Point(4,5)
print(p.x,p.y)

이렇게 쓰 는 것 은 고 급 스 럽 고 간단 해 보이 지만 python 프로그램 에 있어 서 는 엄밀 하지 않다.어떤 하위 클래스 가 slot () 방법 이나 @ property (또는 설명자) 를 사용 하여 특정한 속성 을 포장 하면 인 스 턴 스 를 직접 방문 하 는 사전 이 무 너 집 니 다.따라서 이런 표기 법 을 사용 하 는 것 을 권장 하지 않 는 다.
비록 데이터 구 조 를 간소화 하 는 몇 가지 방법 이 매우 실 용적 이지 만 그 단점 은 IDE 의 문서 와 도움 에 영향 을 줄 수 있다 는 것 이다. 만약 에 사용자 가 특정한 유형 에 도움 을 청 하면 필요 한 매개 변 수 는 정상 적 인 형식 으로 표현 되 지 않 는 다.
print(help(Stock))
    :
class Stock(Structure)
 |  Method resolution order:
 |      Stock
 |      Structure
 |      builtins.object
 |  
 |  Data and other attributes defined here:
 |  
 |  _fields = ['name', 'shares', 'prices']
 |  
 |  ----------------------------------------------------------------------
 |  Methods inherited from Structure:
 |  
 |  __init__(self, *args, **kwargs)
 |      Initialize self.  See help(type(self)) for accurate signature.
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors inherited from Structure:
 |  
 |  __dict__
 |      dictionary for instance variables (if defined)
 |  
 |  __weakref__
 |      list of weak references to the object (if defined)

None

init () 에서 강제 서명 을 통 해 이 bug 를 해결 할 수 있 지만 프로그래머 의 업 무량 이 증가 할 뿐만 아니 라 운행 속도 도 느 려 추천 하지 않 습 니 다.

좋은 웹페이지 즐겨찾기