문제

Java와 동등한 문서를 찾을 수 없었습니다. final 파이썬에는 그런 것이 있습니까?

객체의 스냅 샷을 만들고 있습니다 (실패한 경우 복원에 사용). 이 백업 변수가 할당되면 수정되지 않아야합니다. 파이썬의 최종 기능이 좋을 것입니다.

도움이 되었습니까?

해결책

Java BE에 변수가 있습니다 final 기본적으로 변수에 할당하면 다른 객체를 가리키기 위해 해당 변수를 재 할당 할 수 없음을 의미합니다. 실제로 객체를 수정할 수 없다는 의미는 아닙니다. 예를 들어 다음 Java 코드는 완벽하게 잘 작동합니다.

public final List<String> messages = new LinkedList<String>();

public void addMessage()
{
    messages.add("Hello World!");  // this mutates the messages list
}

그러나 다음은 컴파일되지 않을 것입니다.

public final List<String> messages = new LinkedList<String>();

public void changeMessages()
{
    messages = new ArrayList<String>();  // can't change a final variable
}

그래서 당신의 질문은 final 파이썬에 존재합니다. 그렇지 않습니다.

그러나 Python에는 불변의 데이터 구조가 있습니다. 예를 들어, a list, 당신은 돌연변이 할 수 없습니다 tuple. 당신은 a를 돌릴 수 있습니다 set 그러나 아닙니다 frozenset, 등.

저의 조언은 언어 수준에서 고정을 시행하는 것에 대해 걱정하지 않고 단순히 할당 된 후에 이러한 객체를 돌연변이하는 코드를 작성하지 않도록하는 데 집중하는 것입니다.

다른 팁

파이썬에는``최종 ''에 해당하는 것이 없습니다.

그러나 클래스 인스턴스의 읽기 전용 필드를 만들려면 재산 기능.

편집하다: 아마도 당신은 다음과 같은 것을 원할 것입니다.

class WriteOnceReadWhenever:
    def __setattr__(self, attr, value):
        if hasattr(self, attr):
            raise Exception("Attempting to alter read-only value")

        self.__dict__[attr] = value

할당 온스 변수는 설계 문제입니다. 변수가 한 번만 설정되는 방식으로 응용 프로그램을 설계합니다.

그러나 디자인의 런타임 확인을 원한다면 객체 주변의 래퍼로 수행 할 수 있습니다.

class OnePingOnlyPleaseVassily( object ):
    def __init__( self ):
        self.value= None
    def set( self, value ):
        if self.value is not None:
            raise Exception( "Already set.")
        self.value= value

someStateMemo= OnePingOnlyPleaseVassily()
someStateMemo.set( aValue ) # works
someStateMemo.set( aValue ) # fails

그것은 어리석지 만 런타임에 설계 문제를 감지합니다.

그와 같은 일은 없다. 일반적으로 파이썬 태도는 "이 수정을 원하지 않는다면 수정하지 마십시오"입니다. API의 클라이언트는 어쨌든 문서화되지 않은 내부를 찌르지 않을 것입니다.

본인은 본질적으로 불변이 불가능한 모델의 관련 비트에 튜플이나 이름을 사용 하여이 문제를 해결할 수 있다고 생각합니다. 물론 변이해야 할 모델의 일부에도 도움이되지 않습니다.

파이썬은 "최종"과 동등하지 않습니다. 이름 지정 협약을 제외하고 "공공"및 "보호 된"도 없습니다. "속박과 징계"가 아닙니다.

당신은 당신을 통해 그런 것을 시뮬레이션 할 수 있습니다 설명자 프로토콜, 그것은 당신이 원하는 방식으로 읽기 및 변수를 정의 할 수 있으므로.

class Foo(object):

  @property
  def myvar(self):
     # return value here

  @myvar.setter
  def myvar(self, newvalue):
     # do nothing if some condition is met

a = Foo()
print a.myvar
a.myvar = 5 # does nothing if you don't want to

http://code.activestate.com/recipes/576527/ 동결 함수는 완벽하게 작동하지 않지만 동결 기능을 정의합니다.

나는 그것을 돌연변이로 남겨 두는 것을 고려할 것입니다.

이것은 오래된 질문이지만 또 다른 잠재적 옵션을 추가 할 것이라고 생각했습니다. assert 변수를 확인하려면 원래 설정 한 내용으로 설정되어 있습니다. 이것은 동일하지는 않지만 final Java에서는 비슷한 효과를 만드는 데 사용될 수 있습니다.

PI = 3.14
radius = 3

try:
    assert PI == 3.14
    print PI * radius**2
except AssertionError:
    print "Yikes."

위에서 볼 수 있듯이 PI 어떤 이유로 든 설정되지 않았습니다 3.14, an AssertionError 던져 질 것입니다 try/except 블록은 아마도 현명한 추가 일 것입니다. 그럼에도 불구하고 상황에 따라 유용 할 수 있습니다.

파이썬에는 실제로 최종 유형이 없으며 튜플과 같은 불변 유형이 있지만 다른 것입니다.

여기서 다른 답변 중 일부는 의사 최종 변수로 가득 찬 클래스를 만들고 클래스가 몇 가지 최종 유형 만있는 것을 선호하므로 설명자를 사용하여 최종 유형을 만들 것을 제안합니다.

from typing import TypeVar, Generic, Type

T = TypeVar('T')

class FinalProperty(Generic[T]):
    def __init__(self, value: T):
        self.__value = value
    def __get__(self, instance: Type, owner) -> T:
        return self.__value
    def __set__(self, instance: Type, value: T) -> None:
        raise ValueError("Final types can't be set")

이 클래스를 사용하는 경우 :

class SomeJob:
    FAILED = FinalProperty[str]("Failed")

그러면 해당 클래스의 모든 인스턴스에서 해당 변수를 설정할 수 없습니다. 불행히도 writeoncereadewhenewhene 답변과 마찬가지로 클래스 변수를 여전히 설정할 수 있습니다.

job = SomeJob()
job.FAILED = "Error, this will trigger the ValueError"
SomeJob.FAILED = "However this still works and breaks the protection afterwards"
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top