2017-12-09 1 views
0

함수에 전달한 변수의 이름을 가져 오려고합니다.클래스 함수에서 인수/매개 변수에서 변수 이름 가져 오기

class A(): 
    def __init__(self): 
    self.a = 1 

class B(): 
    def __init__(self): 
    self.b = A() 
    self.c = A() 

    def doSomething(self, hello): 
    print(hello) 

B().doSomething(B().b) 
<__main__.A object at 0x7f67571a3d68> 

내가 원하는 것은 변수 B(). doSomething()에서 변수 b를 식별 할 수 있다는 것입니다. 이것이 가능한가? 한 가지 제한 사항은 B() 함수에서입니다. doSomething() 인스턴스 변수는 B 만 전달됩니다.

이 peewee ( https://github.com/coleifer/peewee)에서 예를 들어, MySQL의 ORM 파이썬에서, 그들은 같은 필터링 표현식을 구축 :

B.select().where(B.b == True) 

을 그리고 어떻게 든 그들은 식별 할 수있는, 즉 B가 전달됩니다. 그렇지 않으면 쿼리를 제대로 빌드 할 수 없기 때문입니다.

나는 그들이 클래스에서 정적 변수를 사용하고 있다는 것을 알고있다. 아마도이 트릭 일까?

도와 주셔서 감사합니다. :)

+0

질문 아무튼 코드의 경우, doSomething에 전달되는 속성이 소속 된 클래스 확인, C을 세 번째 클래스를 만드는 것이 가장 좋습니다 말이 안돼. 'hello == 'b''를 결정하려고합니까? 아니면 실제 변수 이름을 결정하려고합니까? 아니면'self.b == hello'를 결정하려고합니까? – MCBama

+0

실제 변수 이름을 얻으려고합니다. 그것은 또한 B(). c를 전달하는 것일 수도 있습니다. 그러면 나는 c가 통과 한 것을 알게 될 것입니다. – EDNA

답변

0

B().doSomething(B().b) 예를 들어 호출로가는 나는 변수 helloclass B 객체에 선언 된 변수 b과 동일한 경우는 당신이 결정을 시도한다고 가정하겠습니다.

이 경우에는 self 참조로 전화하면됩니다. self은 작업중인 개체의 인스턴스를 참조하며 클래스 내에 정의 된 모든 메서드는 메서드의 특성으로 개체의 self에 대한 참조를 자동으로 가져옵니다.

따라서, 객체 b 변수가 hello 매개 변수 당신이해야 할 모든 동일 여부를 결정하는 것은

+0

'self.b == hello'를 비교하면 잘못된 변수 이름을 얻는'B(). doSomething (B(). c)'를 전달하면 가능할 수 있습니다. 왜냐하면'B() .b'와'B(). c '는 같은 클래스를 가지고 있기 때문입니다. – EDNA

+0

아니요. 왜냐하면 'B() .b! = B(). c'는 동일한 클래스 일 수 있지만 서로 다른 인스턴스이기 때문입니다. 따라서, 그것들은 동등하지 않을 것이고, 기술적으로 "if ... else"문을 수행하여 어느 것이 전달되었는지 판별 할 수 있습니다. 왜 이렇게해야하는지 나는 정말로 모르겠다. – MCBama

+0

데이터베이스에 대한 쿼리가 있으면 사용자가 B(). b 또는 B(). 예를 들어 B()를 전달했는지 알아야합니다 .b 집 가격과 B() .c 나는 세대주의 전화 번호를 저장합니다. 이 구별 할 수 없다면 데이터베이스에 대한 식을 올바르게 작성할 수 없습니다. 코드 스 니펫을 줄 수 있습니까? 'if self.b == hello :'시도했지만 작동하지 않습니다. 할당이 인수를 통과했기 때문에 어쩌면? [link] (https://stackoverflow.com/questions/986006/how-do-i-pass-a-variable-by-reference) – EDNA

0

B().bif self.b == hello: #do codeB의 인스턴스 변수가 없습니다; 오히려 A의 인스턴스 변수입니다. 생성자에서 Bself.aB의 인스턴스이거나 self.a의 인스턴스가 B의 인스턴스가 될 수도 있습니다. 이것이 일반적인 생각이라면 boolean 오버로드 메서드를 구현하여이 두 메서드를 구별 할 수 있습니다.

class A(): 
    def __init__(self): 
    self.a = 1 
    def __bool__(self): 
     return True 

class B(): 
    def __init__(self): 
    self.b = 1 
    def __bool__(self): 
    return False 


class C(): 
    def __init__(self): 
     self.a = A() 
     self.b = B() 
    def doSomething(self, hello): 
     if not hello: 
      print("instance of a got passed") 
     else: 
      print("instance of b got passed") 

C().doSomething(C().b) 

출력 :

instance of b got passed 
+0

아쉽게도 예를 들어 self.a = IntegerField () 및 self.b = IntegerField(), 두 번 같은 클래스를 사용합니다. – EDNA