실제로는 항상 필요하지 않은 변수 초기화를 임의의 기본값으로 __init__
에서하지 않는 것이 좋습니다.
이런 경우에는 OO 사용에 의문이 생기지 만, __init__
이 모든 것을 수행하지는 않지만 타당하고 이해할 수있는 경우가있을 것이라고 확신합니다. 클래스는 추가 특성을 추가하여 추가로 수정하려고합니다. 다른 방법.
내 생각에 적절한 방법은 변수가 사용하고자하는 방법을 실행하는 동안 설정되어 있는지 테스트하려면 hasattr
을 사용하는 것입니다. 이것은 이것이 방법을 사용하는 유효한 방법이고, 테스트가 합당한 방법으로 행동을 바꾸는 경우입니다.
또 다른 방법은이를 사용하고 예외를 처리하고 클래스 사용자가 잘못하고있는 것에 대한 사용자 친숙한 정보를 제공하는 것입니다. 이것은 메소드가 실행 전에 속성을 설정해야하는 경우입니다.
즉, 안녕하세요. 클래스를 초기화했지만 z_run
메서드를 실행하기 전에 z_init
메서드를 호출하여 z
특성이 있는지 확인해야합니다.
또 다른 파이썬 방법은 문서화 문자열에서 메소드를 사용하는 방법을 문서화 한 다음 부적절하게 사용되면 예외를 처리하도록하는 것입니다. 이것은 무언가를 처음으로 구현할 때 충분하므로 다음 작업에 집중할 수 있습니다. 이것은 위와 같은 상황에 있으며 메서드는 속성을 설정해야합니다.
변수를 임의의 기본값으로 초기화한다는 생각이 맘에 들지 않는 이유는 (임의적이기 때문에) 혼란스럽고 라인 노이즈라는 것입니다.
값이 이 아니고이 아니며 단순히 변경할 수있는 기본값 인 경우 __init__
메서드에서 기본값을 사용해야하며이 값을 재정의 할 수 있습니다. 실제로 유효한 초기 상태 일 수도 있습니다. 이 아니며이 아니므로 __init__
메소드에서 설정해야합니다.
은에 달려 있으며, 다른 방법으로 속성을 추가하거나 임의의 값으로 속성을 초기화하여이 작업을 수행하는 경우 OO 사용을 자제해야합니다.
시므온 비서 (Simeon Visser)는 개체를 일관된 상태로 유지한다고 말하지만 추상적 인 예를 기반으로 일관성을 유지할 근거가 없습니다. Pylint가 이런 종류의 경고를하는 동안, 린트 프로그램의 경고는 단순히 높은 수준의 평론가가 보통 코드 냄새를 나타내는 것을 경고 할 수 있도록하기위한 것입니다. 실제 평론가가 모든 코드를 읽고 이해해야하며 따라서 Pylint가 실제로 필요하지 않기 때문에 고위 평론가에게 말합니다.
엄지 손가락의 규칙을 나누기 예 :
class Mutant(object):
"""A mutant!"""
def __init__(self):
"""A mutant is born with only 1 eye and 1 mouth"""
self.eyes = 1
self.mouth = 1
self.location = 'Montana'
def roll_to(self, location):
"""If they have limbs, running is less dangerous"""
if hasattr(self, 'limbs'):
print 'Your mutant broke its limbs off!!'
del self.limbs
self.location = location
def run_to(self, location):
"""If they don't have limbs, running is not effective"""
if not hasattr(self, 'limbs'):
print 'Your mutant tries to run but he has no limbs.'
else:
self.location = location
def grow_limbs(self, number_of_limbs):
"""Ah, evolution!"""
assert number_of_limbs > 0, 'Cannot grow 0 or less limbs...'
if hasattr(self, 'limbs'):
self.limbs += number_of_limbs
else:
self.limbs = number_of_limbs
동의했다. 일관성이 중요합니다. 외부인이 API 또는 클래스를 유효하지 않은 상태로 사용하는 것을 원하지 않습니다. –
'일관된 상태'의 의미를 간단히 정의 할 수 있습니까? 인스턴스화 후에 새로운 멤버 변수를 추가해야한다는 것을 의미합니까? – user1893354
@ user1893354 인스턴스화 후에 변수를 추가 할 수는 있지만 객체를 만들고 하나 이상의 메소드를 호출하여 지저분한 객체로 끝낼 수 없어야합니다. 메서드와 반환 값의 동작은 항상 일치해야합니다. 예를 들어, 우리는'깨진'과'제대로 작동하는'것을보고하는'Car' 클래스를 가질 수 없습니다. –