제가 인스턴스화 한 객체가 기본적으로 하위 객체를 인스턴스화하는지 확인하려고합니다. 그래서 객체 검사/입력 오류 검사를 마칠 때까지이 방법을 계속 수행 할 수 있습니다. 목표는 다른 코드에 의해 자동 생성 된 특성이 무엇인지 모른 채 해당 개체의 정보를 채우는 것이므로 사전에 예고없이 변경 될 수 있습니다. 재귀 함수를 사용하여이 작업을 수행하려고합니다. 그것은 예와 좀 더 명확 수 있습니다 :인스턴스화 된 클래스 속성 유형을 확인하는 방법은 무엇입니까?
### content of B.py:
class B:
def __init__(self):
self.Ba = ''
self.Bb = 0
### content of A.py
from B import B
class A:
def __init__(self):
self.B = B()
self.Aa = ''
self.Ab = False
### content of SDK.py
from A import A
primitiveTypes = (int, str, bool, type(None))
class G:
def createIt(self, **options)
fillMe = A()
fillMe = self.fillWithData(fillMe, options)
#Do stuff with fillMe (post in JSON format to REST API...)
def fillWithData(self, obj, options)
for a in dir(obj):
if not callable(a) and not a.startswith('_'):
if isinstance(a, primitiveTypes):
obj.__dict__.update({a: options.get(a)})
else:
#This never gets executed because isinstance always returns true -> because it evaluates A.B as type string instead of being of type B
obj.__dict__.update({a: self.fillWithData(a, options)})
### content of test.py
from SDK import G
g = G()
g.createIt(Aa='Aa', Ab=True, Ba='Ba', Bb=1) #Make correct input succeed
g.createIt(Aa=1, Ab='', Ba=None, Bb=False) #Make incorrect input fail
편집 : return 문을 제거, 그 내 의심을 지우기 주셔서 감사합니다.
나는 왜이 모든 다른 파일이 필요한지 설명합니다. 저는 현재 사람들이 REST API (사용자 생성, 로그인 생성, 물건 추가, 물건 수정, 역할, 권한 등과 같은 것들 삭제)와 상호 작용할 수 있도록 SDK를 작성하고 있습니다. 그래서 우리는 C#은 코드 생성기에 의해 python으로 변환되는 모델과 enum (메소드 없음)을 정의합니다. 위의 예에서 모델은 A.py 및 B.py입니다. SDK (G.py)로 가져 오기 때문에 SDK 메소드를 사용하는 test.py가 있습니다.
그래서이 문제는 다음과 같습니다 isinstance는 항상 true를 반환 - 그것은, 정말
G.fillWithData()에서는 반환 값으로하는 모든 작업이 로컬 변수에 지정되기 때문에 반환 객체가 필요 없습니다 'G.creatIt()'에'fillMe'라는 이름을 붙였습니다.이 메쏘드는 아무 것도하지 않습니다 (그래서 버려집니다). 귀하의 질문에있는 코드의 마지막 두 줄에서 하나가 맞지만 다른 것은 맞지 않습니다. 각각의 경우에 무엇이 옳고 그 결과에 문제가 있는지 질문하고 설명하십시오. – martineau
@martineau 사실,'self.fillWithData (a, options)}'는 재귀 적으로 호출되며'fillWithData'의'else' 본문에서 반환 값이 사용됩니다. 사용되었으므로 인스턴스 변수 여야합니까? 또는'G' 모두가 수업 일 필요는 없습니다. –
@ juanpa.arrivillaga : 재귀 적으로 호출 된 경우에도 궁극적 인 반환 값은 초기 호출자가 사용하지 않습니다. – martineau