>백엔드 개발 >파이썬 튜토리얼 >Python의 클래스 정의 내 목록 이해에서 클래스 변수에 직접 액세스할 수 없는 이유는 무엇입니까?

Python의 클래스 정의 내 목록 이해에서 클래스 변수에 직접 액세스할 수 없는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-26 22:26:17304검색

Why Can't I Access Class Variables Directly in List Comprehensions Within a Class Definition in Python?

클래스 정의 내 리스트 컴프리헨션에서 클래스 변수에 액세스

클래스 변수는 함수 정의 내의 리스트 컴프리헨션에서 액세스할 수 있지만 클래스 정의 내의 리스트 컴프리헨션에서는 액세스할 수 없습니다. . 이러한 불일치는 클래스 범위가 리스트 컴프리헨션이나 생성기 표현식이나 함수 정의와 같은 기타 포함된 범위로 확장되지 않는다는 사실에서 비롯됩니다.

대신 리스트 컴프리헨션 및 기타 그러한 표현식에는 자체 로컬 범위가 있어 클래스 범위에 액세스할 수 없습니다. 바깥쪽 클래스 범위에 정의된 변수. 이 동작은 Python의 모든 버전에서 일관됩니다.

해결 방법

클래스 정의 내의 목록 이해에 있는 클래스 변수에 액세스하려면 다음 해결 방법 중 하나를 사용할 수 있습니다.

  • 명시적 함수 사용: 클래스 변수를 인수로 사용하는 클래스 내 함수를 정의합니다. 그런 다음 리스트 컴프리헨션은 함수에 전달된 변수를 사용할 수 있습니다.
  • __init__을 사용하여 인스턴스 변수를 만듭니다. 클래스의 생성자(__init__)에서 인스턴스 변수를 만듭니다. 그런 다음 인스턴스 변수는 목록 이해에서 액세스할 수 있습니다.

다음 예를 고려하십시오.

class Foo:
    x = 5

    # Error in Python 3: 'NameError: name 'x' is not defined'
    y = [x for i in range(1)]

이 예에서 클래스 변수 x를 사용하려면 , 다음 해결 방법 중 하나를 사용할 수 있습니다.

명시적 사용 함수:

def get_y(x):
    return [x for i in range(1)]

y = get_y(x)

__init__을 사용하여 인스턴스 변수 만들기:

def __init__(self):
    self.y = [self.x for i in range(1)]

기타 고려 사항

앞서 언급한 해결 방법에도 불구하고, 일반적으로 클래스 정의 내의 목록 이해에서 클래스 변수에 액세스하지 않는 것이 좋습니다. 이러한 관행은 특히 다른 개발자와 공동 작업할 때 혼란과 잠재적인 오류를 초래할 수 있습니다.

더 깔끔하고 유지 관리하기 쉬운 접근 방식을 위해서는 클래스 정의 내의 클래스 변수에 액세스할 때 목록 이해 대신 함수나 인스턴스 변수를 사용하는 것이 좋습니다.

위 내용은 Python의 클래스 정의 내 목록 이해에서 클래스 변수에 직접 액세스할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.