logo

Python의 클래스 또는 정적 변수

모든 객체는 클래스 또는 정적 변수를 공유합니다. 인스턴스 또는 비정적 변수는 개체마다 다릅니다(모든 개체에는 복사본이 있음). 예를 들어 컴퓨터 과학 학생을 수업으로 대표한다고 가정해 보겠습니다. CSS학생 . 클래스에는 모든 객체에 대해 값이 cse인 정적 변수가 있을 수 있습니다. 그리고 클래스에는 다음과 같은 비정적 멤버가 있을 수도 있습니다. 이름 그리고 .

C++ 및 Java에서는 정적 키워드를 사용하여 변수를 클래스 변수로 만들 수 있습니다. 앞에 정적 키워드가 없는 변수는 인스턴스 변수입니다. Java 예제는 이 항목을, C++ 예제는 이 항목을 참조하세요.



설명:

Python에서 정적 변수는 각 인스턴스에 고유하지 않고 클래스의 모든 인스턴스에서 공유되는 변수입니다. 클래스의 특정 인스턴스가 아닌 클래스 자체에 속하기 때문에 클래스 변수라고도 합니다.

정적 변수는 클래스 정의 내부에 정의되지만 메서드 정의 외부에 정의됩니다. 일반적으로 인스턴스 변수처럼 값으로 초기화되지만 인스턴스가 아닌 클래스 자체를 통해 액세스하고 수정할 수 있습니다.

정적 변수의 특징

  • 정적 변수는 클래스의 객체가 처음 생성될 때 메모리가 한 번 할당됩니다.
  • 정적 변수는 메소드 외부가 아닌 클래스 내부에서 생성됩니다.
  • 정적 변수는 클래스를 통해 액세스할 수 있지만 인스턴스를 통해 직접 액세스할 수는 없습니다.
  • 정적 변수 동작은 모든 개체에 대해 변경되지 않습니다.

Python 접근 방식은 간단합니다. 정적 키워드가 필요하지 않습니다.



메모: 값이 할당된 모든 변수 그만큼 클래스 선언은 클래스 변수입니다. 그리고 변수 저것 메서드 내부에 할당된 값은 인스턴스 변수입니다.

안녕하세요 세계 자바

예:

파이썬






# Python program to show that the variables with a value> # assigned in class declaration, are class variables> # Class for Computer Science Student> class> CSStudent:> >stream>=> 'cse'> # Class Variable> >def> __init__(>self>,name,roll):> >self>.name>=> name># Instance Variable> >self>.roll>=> roll># Instance Variable> # Objects of CSStudent class> a>=> CSStudent(>'Geek'>,>1>)> b>=> CSStudent(>'Nerd'>,>2>)> print>(a.stream)># prints 'cse'> print>(b.stream)># prints 'cse'> print>(a.name)># prints 'Geek'> print>(b.name)># prints 'Nerd'> print>(a.roll)># prints '1'> print>(b.roll)># prints '2'> # Class variables can be accessed using class> # name also> print>(CSStudent.stream)># prints 'cse'> # Now if we change the stream for just a it won't be changed for b> a.stream>=> 'ece'> print>(a.stream)># prints 'ece'> print>(b.stream)># prints 'cse'> # To change the stream for all instances of the class we can change it> # directly from the class> CSStudent.stream>=> 'mech'> print>(a.stream)># prints 'ece'> print>(b.stream)># prints 'mech'>

>

>

산출

cse cse Geek Nerd 1 2 cse ece cse ece mech>

산출:

cse cse Geek Nerd 1 2 cse ece cse ece mech>

예:

파이썬




class> MyClass:> >static_var>=> 0> >def> __init__(>self>):> >MyClass.static_var>+>=> 1> >self>.instance_var>=> MyClass.static_var> obj1>=> MyClass()> print>(obj1.instance_var)># Output: 1> obj2>=> MyClass()> print>(obj2.instance_var)># Output: 2> print>(MyClass.static_var)># Output: 2>

>

>

산출

1 2 2>

설명:

이 예제에서는 0으로 초기화된 static_var 정적 변수가 있는 MyClass 클래스를 정의합니다. 또한 클래스의 각 인스턴스에 고유한 인스턴스 변수 instance_var도 정의합니다.

클래스(obj1)의 인스턴스를 생성할 때 정적 변수의 값을 1씩 증가시키고 이를 인스턴스 변수에 할당합니다. 클래스(obj2)의 다른 인스턴스를 생성할 때 정적 변수를 다시 증가시키고 해당 인스턴스의 인스턴스 변수에 새 값을 할당합니다.

마지막으로 클래스의 인스턴스가 아닌 클래스 자체를 사용하여 정적 변수의 값을 인쇄합니다. 보시다시피 정적 변수의 값은 클래스의 모든 인스턴스에서 공유되며 새 인스턴스가 생성될 때마다 증가됩니다.

정적 변수는 클래스의 모든 인스턴스에서 상태를 유지하거나 클래스의 모든 인스턴스에서 데이터를 공유하는 데 유용할 수 있습니다. 그러나 이를 주의 깊게 사용하고 특히 다중 스레드 환경에서 해당 값이 프로그램 상태와 동기화되는지 확인하는 것이 중요합니다.

장점:

    메모리 효율성: 정적 변수는 클래스의 모든 인스턴스에서 공유되므로 동일한 데이터의 여러 복사본을 만들 필요가 없어 메모리를 절약할 수 있습니다. 공유 상태: 정적 변수는 클래스의 모든 인스턴스에서 공유 상태를 유지하는 방법을 제공하여 모든 인스턴스가 동일한 데이터에 액세스하고 수정할 수 있도록 허용합니다. 접근 용이성: 클래스 인스턴스가 없어도 클래스 이름 자체를 사용하여 정적 변수에 접근할 수 있습니다. 이렇게 하면 정적 변수에 저장된 데이터에 액세스하고 수정하는 것이 더 편리해집니다. 초기화 : 클래스가 정의될 ​​때 정적 변수를 초기화할 수 있으므로 변수에 유효한 시작 값이 있는지 쉽게 확인할 수 있습니다. 가독성 : 정적 변수는 변수에 저장된 데이터가 클래스의 모든 인스턴스에서 공유된다는 것을 명확하게 나타내므로 코드의 가독성을 향상시킬 수 있습니다.

단점:

    유연성 없음: 정적 변수는 해당 값이 클래스의 모든 인스턴스에서 공유되므로 인스턴스마다 다른 값을 갖기가 어렵기 때문에 유연성이 없을 수 있습니다. 숨겨진 종속성: 정적 변수는 코드의 여러 부분 간에 숨겨진 종속성을 생성하여 코드를 이해하고 수정하기 어렵게 만들 수 있습니다. 스레드 안전성: 정적 변수는 적절하게 동기화되지 않으면 경쟁 조건 및 동기화 문제가 발생할 수 있으므로 다중 스레드 환경에서 문제가 될 수 있습니다. 네임스페이스 오염: 정적 변수가 클래스의 네임스페이스에 추가되어 잠재적으로 이름 충돌이 발생하고 코드 유지 관리가 더 어려워질 수 있습니다. 테스트: 정적 변수의 상태가 클래스 및 해당 메서드의 동작에 영향을 미칠 수 있으므로 정적 변수로 인해 효과적인 단위 테스트를 작성하기가 더 어려워질 수 있습니다.

전반적으로 정적 변수는 Python 프로그래밍에서 유용한 도구가 될 수 있지만 유연성 없음, 숨겨진 종속성 및 스레드 안전 문제와 같은 잠재적인 단점에 주의하여 사용해야 합니다.