문제

나는 다음과 같은 일을하고 있습니다.

class Class(object):
    def __init__(self):
        self.var=#new instance name string#   

'c'의 인스턴스 이름 문자열을 사용하기 위해 인스턴스의 __ init __ 메소드를 어떻게 만드나요? 대하여 말하면 :

c=Class()

C.var가 'C'와 동일합니다.

답장을 보내 주셔서 감사합니다. 지속성을 구현하고 있으며 수업은 지속적인 객체의 수업입니다. __ init __는 다음과 같은 경우 데이터베이스에 항목을 추가하려고합니다.

c=Class()

그런 다음 다음과 같이 가정합니다.

del c

나중에:

c=Class()

Sholuld 데이터베이스에서 데이터를 사용하여 인스턴스를 작성하여 이미 'C'가있는 경우 새 항목을 만듭니다.


답장을 보내 주셔서 감사합니다. 지속성을 구현하고 있으며 수업은 지속적인 객체의 수업입니다. __ init __는 다음과 같은 경우 데이터베이스에 항목을 추가하려고합니다.

c=Class()

그런 다음 다음과 같이 가정합니다.

del c

나중에:

c=Class()

Sholuld 데이터베이스에서 데이터를 사용하여 인스턴스를 작성하여 이미 'C'가있는 경우 새 항목을 만듭니다.

도움이 되었습니까?

해결책

데이터 객체를 지속하려면 데이터베이스 레코드의 고유 ID를 사용해야합니다.

Pesudo Code 사용중인 데이터베이스 모듈을 모르기 때문입니다.

import db # assume this is your db module

class Class(object):
    def __init__(self):
        self.id = None
        self.name = None

    def get_by_id(self, id):
        records = db.execute('select * from table where id=%s' % str(id))
        if records:
            self.id = records[0]['id']
            self.name = records[0]['name']

    def save(self):
        db.execute('update table set name=%s where id=%s' % (self.name, str(self.id)))

다시 말하지만, 이것은 의사 코드이며, 내가 사용하는 문자열 주입 기술은 상당히 안전하지 않은 것으로 권장되지 않습니다.

다른 팁

파이썬에는 변수가 없습니다 대상과 이름. 당신이 할 때

c = Class()

당신은 두 가지 일을하고 있습니다 :

  1. 유형의 새로운 객체 만들기 Class
  2. 개체를 이름에 바인딩합니다 c 현재 범위에서.

당신이 만든 객체는 "가변 이름"이라는 개념이 없습니다. 나중에 당신이 할 경우

a = c

그런 다음 이름을 사용하여 동일한 객체에 정확히 같은 방식으로 액세스 할 수 있습니다. a 그리고 c. 이름을 삭제할 수 있습니다 a, 그리고 객체는 여전히 존재할 것입니다.

당신이 만든 객체에 이름이 있어야한다면 가장 좋은 방법은 그들에게 전달하는 것입니다. 명시 적으로,

class Class(object):
    def __init__(self, name):
        self.name = name

var = Class('var')

당신은 이것을 할 수 없습니다. 그 이유는 클래스의 객체가 먼저 만들어지고 나중에 만 인스턴스의 이름에 묶여 있기 때문입니다.

당신은 할 수 없습니다 (스택 프레임을 검사하고 바이트 코드를 검사하는 것과 같은 놀라운 해킹이 부족합니다). 조차도 할 수 없습니다 ~이다 이름이 있거나 그러한 이름이 여러 개있을 수 있습니다. 예를 들어 다음 코드 조각에 대해 제공해야 할 사항 :

l = [Class(), Class()]
a=b=c=d=Class()

객체가 완전히 구성되고 초기화 된 후 새 인스턴스 Occour의 변수에 대한 할당이 있기 때문에 이것이 가능하지 않다고 생각합니다. 이니 방법

깊은 반사와 디버거를 사용하지 않고 프로그래밍 방식으로 변수 이름에 액세스 할 수있는 방법을 알지 못합니다. 정보가 런타임에 사용할 수 있다고 생각하지 않습니다.

인스턴스에 (고유 한가?) 이름을 주려면 이니셜 라이저가 추가 인수를 수락하도록해야합니다.

def __init__(self, name):
    self.name = name

발신자는 적절한 이름으로 전달해야합니다.

c = Class("c")

이것은 범위 문제입니다. 당신이 요구하는 일을 할 수 없습니다. C는 클래스의 범위 밖에서 선언되므로 인스턴스는 코드에서 이름을 알지 못합니다.

아마도 더 나은 솔루션을 달성하려는 내용에 대한 더 넓은 설명을 제공 할 수 있다면 제안 할 수 있습니다.

불가능합니다. 당신은 변수와 객체를 혼란스럽게하는 것 같습니다.

어쨌든 변수는 없을 수 있습니다.

예를 들어

foo(Class())

Class().arbitraryMethod()

또는 다중 :

a = b = Class()

나는 몇 년 전에 같은 생각을 가지고 있습니다. 이것은 깔끔한 기능이지만 언어 제작자는 그것을 제공하지 않습니다. 그리고 나는 그들이이 위대한 기능을 발견하지 못하는 바보라고 생각했습니다.

그러나 그것에 대해 생각하게됩니다. 논리가 불가능하다고 생각합니다. 말하다:

class Class(object):
    def __init__(self):
        self.instance_name.move() # self.instance_name refer to var
    def move(self):
        print "move"

var = Class()

이제 VAR이 배열이라면 그렇게 가능합니까?

var[0] = Class() # i think it will get confused a bit

그것이 제가 생각하는 것입니다. 인스턴스 자체를 할당하는 것이 가능하다고 생각하지 않습니다. 그리고 일부 언어로는 인스턴스 문자열을 객체에 보낸 다음 eval을 사용하여 함수를 실행했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top