bestsource

Python에서 빈 개체 만들기

bestsource 2023. 8. 22. 22:18
반응형

Python에서 빈 개체 만들기

Python에서 빈 개체를 정의하기 위한 바로 가기가 있습니까? 아니면 항상 사용자 지정 빈 클래스의 인스턴스를 만들어야 합니까?

편집: 오리 타이핑에 사용할 수 있는 빈 개체를 의미합니다.

예, Python 3.3에서 SimpleNamespace가 추가되었습니다.

개체와 달리 SimpleNamespace를 사용하면 속성을 추가하거나 제거할 수 있습니다.SimpleNamespace 개체가 키워드 인수를 사용하여 초기화된 경우 키워드 인수는 기본 네임스페이스에 직접 추가됩니다.

예:

import types

x = types.SimpleNamespace()
x.happy = True

print(x.happy) # True

del x.happy
print(x.happy) # AttributeError. object has no attribute 'happy'

유형을 사용하여 새 클래스를 즉시 만든 다음 인스턴스화할 수 있습니다.이와 같은 경우:

>>> t = type('test', (object,), {})()
>>> t
<__main__.test at 0xb615930c>

입력할 인수는 클래스 이름, 기본 클래스 튜플 및 개체의 사전입니다.함수(개체의 메서드) 또는 속성을 포함할 수 있습니다.

실제로 첫 번째 줄을 줄여서 다음과 같이 할 수 있습니다.

>>> t = type('test', (), {})()
>>> t.__class__.__bases__
(object,)

기본적으로 유형은 객체에서 상속되는 새 스타일 클래스를 만들기 때문입니다.

type메타프로그래밍을 위해 파이썬에서 사용됩니다.

하지만 만약 당신이 단지 객체의 인스턴스를 만들고 싶다면요.그런 다음 인스턴스를 만듭니다.레즐롯이 제안하는 것처럼.

이와 같은 새 클래스의 인스턴스를 만드는 것은 유용할 수 있는 중요한 차이점이 있습니다.

>>> a = object()
>>> a.whoops = 1
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'whoops'

다음과 같은 경우:

>>> b = type('', (), {})()
>>> b.this_works = 'cool'
>>> 

빈(-ish) 객체를 만드는 간단하고 덜 무서워 보이는 한 가지 방법은 함수가 람다 함수를 포함하여 Python의 객체라는 사실을 이용하는 것입니다.

obj = lambda: None
obj.test = "Hello, world!"

예:

In [18]: x = lambda: None

In [19]: x.test = "Hello, world!"

In [20]: x.test
Out[20]: 'Hello, world!'

질문에서 말씀하셨지만 코드로 언급한 답변이 없었기 때문에 이것은 아마도 가장 깨끗한 해결책 중 하나일 것입니다.

class Myobject:
    pass

x = Myobject()
x.test = "Hello, world!"  # working

"빈 물체"가 무슨 뜻입니까?클래스 인스턴스object간단히 실행할 수 있습니다.

a = object()

아니면 null 참조에 대한 초기화를 의미하는 것일 수도 있습니다.그러면 사용할 수 있습니다.

a = None

제안된 모든 해결책은 다소 어색합니다.

저는 촌스럽지 않고 원래 디자인대로 하는 방법을 찾았습니다.

>>> from mock import Mock
>>> foo = Mock(spec=['foo'], foo='foo')
>>> foo.foo
'foo'
>>> foo.bar
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/.../virtualenv/local/lib/python2.7/site-packages/mock/mock.py", line 698, in __getattr__
    raise AttributeError("Mock object has no attribute %r" % name)
AttributeError: Mock object has no attribute 'bar'

여기에서 unittest.mock의 설명서를 참조하십시오.

사용할 수 있습니다.

x = lambda: [p for p in x.__dict__.keys()]

그리고나서

x.p1 = 2
x.p2 = "Another property"

끝나고

x()
# gives
# ['p1', 'p2']

그리고.

[(p, getattr(x,p)) for p in x()]
# gives
# [('p1', 2), ('p2', 'Another property')]

빈 집합 개체를 새로 구성합니다.선택적 반복 가능 매개 변수가 제공되면 반복에서 얻은 요소로 집합을 업데이트합니다.시작할 수 있는 모든 요소는 불변이거나 불변으로 자동 변환하기 위해 프로토콜 섹션에 설명된 프로토콜을 사용하여 불변으로 변환할 수 있어야 합니다.

예:

myobj = set()
for i in range(1,10): myobj.add(i)
print(myobj)

제 생각에, 가장 쉬운 방법은 다음과 같습니다.

def x():pass
x.test = 'Hello, world!'

빈 유형이 빈 개체를 는유빈있는경우개가체다다, 개않호습니지출하싶지만만들고체를해말시원하라고 __init__이니셜라이저, 사용할 수 있습니다.__new__:

class String(object):
    ...

uninitialized_empty_string = String.__new__(String)

출처: https://stackoverflow.com/a/2169191/6639500 .

언급URL : https://stackoverflow.com/questions/19476816/creating-an-empty-object-in-python

반응형