언어 Language/파이썬 Python

Q. 파이썬에서 객체에 새로운 속성이 임의로 추가되지 않도록 하고 싶다면?

Tap to restart 2022. 6. 30. 23:00

A. pydantic을 사용하면 된다.

 

from pydantic import BaseModel


class Person(BaseModel):
    name: str = ''
    gender: str = ''


if __name__ == '__main__':
    john = Person()
    john.age = 23
    print(john.age)

pydantic을 사용하면 아래처럼 에러가 난다.

    john.age = 23
  File "pydantic/main.py", line 357, in pydantic.main.BaseModel.__setattr__
ValueError: "Person" object has no field "age"

 

같은 코드에서 pydantic BaseModel만 제거하면 잘 출력된다. 파이썬 객체의 경우 해당 클래스에 속성이 없으면 그냥 추가해서 저장하기 때문이다.

class Person:
    name: str = 'John'
    gender: str = 'Male'


if __name__ == '__main__':
    john = Person()
    john.age = 23
    print(john.age)
    print(john.gender)
    print(john.name)

결과

23
Male
John

파이썬에서도 pydantic을 쓰면 C나 Java 등 다른 언어처럼 클래스에 미리 정의하지 않은 속성이 추가되는 것을 막을 수 있다.

 

데이터 클래스dataclass도 막아주지 않는다.

from dataclasses import dataclass


@dataclass
class Person:
    name: str = 'John'
    gender: str = 'Male'


if __name__ == '__main__':
    john = Person()
    john.age = 23
    print(john.age)
    print(john.name)
    print(john.gender)

결과

23
John
Male

 

관련 글

Q. 파이썬에서 데이터를 객체로 맵핑하는 방법은?

Q. 파이썬으로 개발할 때 타입 힌트type hints를 쓰면 좋은 점은?