Pythonの__init __(self)のインスタンス名文字列のアドレス指定
-
22-07-2019 - |
質問
このようなことをしています:
class Class(object):
def __init__(self):
self.var=#new instance name string#
「c」のインスタンス名文字列を使用するために、インスタンスの__ init __メソッドを作成するにはどうすればよいですか?ケースで言う:
c=Class()
「c」に等しいc.varが必要です。
ご回答いただきありがとうございます。永続性を実装しており、Classは永続オブジェクトのクラスです。次の場合に__ init __がデータベースにエントリを追加するようにします。
del c
次に、仮定:
<*>後で:
<*>sholuldは、エントリ「c」がすでに存在する場合はデータベースのデータを使用してインスタンスを作成し、そうでない場合は新しいエントリを作成します。
ご回答いただきありがとうございます。永続性を実装しており、Classは永続オブジェクトのクラスです。次の場合に__ init __がデータベースにエントリを追加するようにします。
<*>次に、仮定:
<*>後で:
<*>sholuldは、エントリ「c」がすでに存在する場合はデータベースのデータを使用してインスタンスを作成し、そうでない場合は新しいエントリを作成します。
解決
データオブジェクトを永続化するには、データベースレコードの一意のIDを使用する必要があります。
使用しているデータベースモジュールがわからないため、擬似コード
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)))
繰り返しますが、これは擬似コードです。私が使用している文字列インジェクション手法は、かなり安全ではないのでお勧めできません。
他のヒント
Pythonには変数はなく、オブジェクトと名前があります。するとき
c = Class()
2つのことを実行しています:
- タイプ
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()
オブジェクトが完全に構築および初期化された後、新しいインスタンスの変数への割り当てが発生し、内で割り当てられる変数名がわからないため、これが可能になるとは思わないinit メソッド
私は、ディープリフレクションとデバッガーを使用せずにプログラムで変数の名前にアクセスする方法を知りません。情報は実行時に利用できるとは思わない。
インスタンスに(一意?)名前を付けたい場合は、おそらく初期化子に追加の引数を受け入れさせる必要があります。
def __init__(self, name):
self.name = name
そして、呼び出し元は適切な名前を渡す必要があります:
c = Class("c")
これはスコープの問題であり、求めていることはできません。 cはクラスのスコープ外で宣言されるため、インスタンスはコードで指定されている名前を認識しません。
おそらく、より良い解決策を達成しようとしていることについてより広範な説明を提供できる場合は、提案することができます。
それは不可能です。変数とオブジェクトが混乱しているようです。
いずれの場合でも、変数はない可能性があります:
e.g。
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[0] = Class() # i think it will get confused a bit
それは私が考えていることです。インスタンスをそれ自体に割り当てることは可能だとは思いません。一部の言語では、インスタンス文字列をオブジェクトに送信し、evalを使用して関数を実行しました