معالجة سبيل المثال اسم السلسلة في __init__(self) في بايثون

StackOverflow https://stackoverflow.com/questions/443775

  •  22-07-2019
  •  | 
  •  

سؤال

أنا أفعل شيئا من هذا القبيل:

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

كيف يمكنني جعل __ init __ طريقة بلدي سبيل المثال استخدام اسم المثيل سلسلة 'c'?نقول في هذه الحالة:

c=Class()

أريد ج.فار يساوي 'ج'.

شكرا على الردود انا تنفيذ استمرار الطبقة الثابتة الكائن الدرجة.أريد __ init __ لإضافة إدخال قاعدة البيانات عندما:

c=Class()

ثم لنفترض:

del c

في وقت لاحق:

c=Class()

sholuld إنشاء مثيل باستخدام بيانات من قاعدة البيانات إذا كان هناك بالفعل إدخال 'ج' ، وإلا إنشاء إدخال جديد.


شكرا على الردود انا تنفيذ استمرار الطبقة الثابتة الكائن الدرجة.أريد __ init __ لإضافة إدخال قاعدة البيانات عندما:

c=Class()

ثم لنفترض:

del c

في وقت لاحق:

c=Class()

sholuld إنشاء مثيل باستخدام بيانات من قاعدة البيانات إذا كان هناك بالفعل إدخال 'ج' ، وإلا إنشاء إدخال جديد.

هل كانت مفيدة؟

المحلول

قائمة كائنات بيانات تحتاج إلى استخدام بيانات تسجيل معرف فريد.

pesudo رمز لأنني لا أعرف ما قاعدة بيانات وحدة كنت تستخدم

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()

أنا لا أعتقد أن هذا لن يكون ممكنا لأن الإحالة إلى المتغير الجديد الخاص بك سبيل المثال occours بعد وجوه بالكامل ببناء و تهيئة و إذا كنت لا تعرف اسم المتغير سيتم تعيينه في الحرف الأول طريقة

وأنا على علم وسيلة للوصول إلى اسم متغير برمجيا دون استخدام التفكير العميق ومصحح. أنا لا أعتقد أن المعلومات المتاحة في وقت التشغيل.

إذا كنت تريد أن تعطي أمثلة على (فريدة من نوعها؟) اسم، ربما يجب عليك جعل مهيئ يقبل حجة إضافية.

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

والمتصل ينبغي أن تمر في الاسم المناسب:

c = Class("c")

وهذه مسألة نطاق، لا يمكنك أن تفعل ما كنت طالبا. لأن ستعلن ج خارج نطاق الفصول الدراسية، لديك مثيل يجهل ما لها اختير في التعليمات البرمجية.

وربما إذا كنت يمكن أن توفر تفسيرا أوسع ما كنت تحاول إنجاز أفضل حل يمكن اقتراحها.

وهذا غير ممكن. يبدو لك أن تكون المتغيرات مربكة والكائنات.

في أي حال قد يكون جيدا لن يكون هناك متغير:

ومنها مثلا.

foo(Class())

Class().arbitraryMethod()

وأو متعددة:

a = b = Class()

ولدي نفس الفكر قبل عدة سنوات. وsomekind هذا من ميزة أنيق، ولكن خالق لغة لا توفر ذلك. واعتقدت انهم جميعا غبي لعدم اكتشاف هذه ميزة كبيرة.

ولكن بعد ذلك حان للتفكير في ذلك. أعتقد أن المنطق هو المستحيل. يقول:

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

وهذا ما كنت أفكر، وأنا لا أعتقد أن تعيين المثال في حد ذاته هو ممكن. وفي بعض اللغات أنا فقط أرسلت سلسلة المثال إلى كائن ثم استخدام وحدة التقييم لتنفيذ وظيفة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top