__init __ (self)의 인스턴스 이름 문자열 주소
-
22-07-2019 - |
문제
나는 다음과 같은 일을하고 있습니다.
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()
당신은 두 가지 일을하고 있습니다 :
- 유형의 새로운 객체 만들기
Class
- 개체를 이름에 바인딩합니다
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을 사용하여 함수를 실행했습니다.