python 학습 노트 6.7 - 데이터 구조의 초기 화 과정 간소화
11658 단어 Python 학습 노트python 학습 노트
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 를 해결 할 수 있 지만 프로그래머 의 업 무량 이 증가 할 뿐만 아니 라 운행 속도 도 느 려 추천 하지 않 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
python 학습 노트 6.7 - 데이터 구조의 초기 화 과정 간소화예 를 들 어 데이터 구 조 를 초기 화 하 는 절 차 를 하나의 init () 함수 에 요약 하고 이 를 공공 기본 클래스 에 정의 할 수 있 습 니 다. 이렇게 하면 우 리 는 각종 Structure 기반 클래스...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.