티스토리 뷰

다른 언어를 사용하다 파이썬을 사용하면 정말 적응하기 힘든 것 같다.

오늘 크게 충격 받은 것은 l-value와 r-value의 개념 자체가 다른 것 같다....

 

일단, 파이썬의 모든 값은 자신만의 공간이 있다. 이는 id함수를 통해 확인이 가능하다. (그냥 코드만 보자면, 우리가 아는 l-value가 포인터라고 생각하면 좀더 편하게 생각할 수 있다..... 절대 진짜 포인터라는 것은 아니다.) 

 

3		#140724586779496
a = 3
b = 3
print(id(3))	#140724586779496
print(id(a))	#140724586779496
print(id(b))	#140724586779496

 

위 코드를 통해 '3'이라는 값 자체도 id를 가지고 '3'을 받는 'a'와 'b' 모두 3을 할당 받으면 둘다 '3'과 같은 id를 가진다.

이게 이해가 된다면, 잠깐 이런 생각을 할 수있다.

 

"그럼 서로 다른 클래스가 같은 값을 가진다면 문제가 되지 않나?"

 

문제 되지 않는다.

 

같은 클래스에 무슨 연산을 하든 해당 연산 결과로 나온 값이 있는 id 위치로 변수들이 이동한다.

값이 이동하는게 아니다.

 

 

Class A와 Class B의 p라는 값이 모두 1이라는 값을 가진다.

 

 

Class B의 p를 2더하면, Class B의 p가 가진 값이 변하지 않고 p가 가리키는 값이 변경된다.

 

 

class Dog:
    count = 0    # 클래스 속성
    def __init__(self):
        Dog.count += 1    # 전역 변수 count에 1을 더함
        
    @classmethod
    def printClass(cls):
        return (cls.count)   # 
    
    @classmethod
    def print_count(cls,point):
        cls.count+=point
        print('{0}명 생성되었습니다.'.format(cls.count))    # cls로 클래스 속성에 접근
        return cls.count


class Person:
    count = 0    # 클래스 속성
 
    def __init__(self):
        Person.count += 1    # 전역 변수 count에 1을 더함
     
    def printIns(self):
        return (self.count)
        
    @classmethod
    def printClass(cls):
        return (cls.count)   # 
        
    @classmethod
    def print_count(cls,point):
        cls.count+=point
        print('{0}명 생성되었습니다.'.format(cls.count))    # cls로 클래스 속성에 접근
        return cls.count

doggo = Dog()
doggo.print_count(3)
print('Doggo : ',doggo.count)
print(id(4))
print(id(doggo.print_count(0)))
print(id(5))
print(id(doggo.print_count(1)))

doggoSnack = 5
print("Doggo Snack : ",id(doggoSnack))

print("\n")

james = Person()
print('James : ',james.count)
maria = Person()
print('Maria : ',maria.count)
maria.count+=1

print('James : ',james.count)
print('Maria : ',maria.count)

print("\n")
 
james.print_count(2)    # 2명 생성되었습니다.

print('James printIns : ',james.printIns())
print('Maria printIns : ',maria.printIns())
print('James printClass : ',james.printClass())
print('Maria printClass : ',maria.printClass())

print("\n")

print("4 : ",id(4))
print("P : ",id(Person.print_count(0)))
print("J : ",id(james.print_count(0)))
print("M : ",id(maria.print_count(0)))
4명 생성되었습니다.
Doggo :  4
4명 생성되었습니다.
140724586779528
Doggo Snack :  140724586779560


James :  1
Maria :  2
James :  2
Maria :  3


4명 생성되었습니다.
James printIns :  4
Maria printIns :  3
James printClass :  4
Maria printClass :  4


4 :  140724586779528
4명 생성되었습니다.
P :  140724586779528
4명 생성되었습니다.
J :  140724586779528
4명 생성되었습니다.
M :  140724586779528

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함