كيف تجعل سمة الفئة التي ليس نوع البيانات القياسية؟

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

  •  22-08-2019
  •  | 
  •  

سؤال

ولدي فئة واحدة لا بد من انتزاع السمة التي تم تعيينها في مكان آخر. انها ليست نوع البيانات القياسية بالرغم من ذلك. هنا هو رمز؛

class graphics:
def __init__(self, Fullscreen = False, Width = 640, Height = 480):
    print "Graphics Init"
    SCREEN_SIZE = (Width, Height)
    pygame.init()
    if Fullscreen:
        self.screen = pygame.display.set_mode(SCREEN_SIZE, FULLSCREEN, 32)
        print "Fullscreen Initialized"
    else:
        self.screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32)
        print "Non-Fullscreen Initialized"

وماذا أحتاج إلى القيام به هو إشارة السمة الشاشة، وهو ما يمكن أن يحدد مع self.screen وتكون قابلة للقراءة ضمن تلك الفئة ... ولكن من فئة أخرى لا بد لي من وضع

screen = ?

وتحت

class graphics:

وماذا تحتاج أن علامة استفهام أن تكون؟ لقد حاولت 0، لا شيء، "" ... لا شيء يبدو للعمل، ليس لدي أي فكرة ما هو نوع البيانات ستكون تلك الدعوة pygame. : S

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

المحلول

وأنت نادرا ما، سمات مرجع من فئة. يمكنك الرجوع سمات كائن.

و(أيضا، يجب أن تكون أسماء فئة الأحرف الكبيرة: Graphics).

class Graphics:
SCREEN_SIZE = (640, 480)
def __init__(self, Fullscreen = False, Width = 640, Height = 480):
    print "Graphics Init"
    self.SCREEN_SIZE = (Width, Height)
    pygame.init()
    if Fullscreen:
        self.screen = pygame.display.set_mode(SCREEN_SIZE, FULLSCREEN, 32)
        print "Fullscreen Initialized"
    else:
        self.screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32)
        print "Non-Fullscreen Initialized"

وهنا مثال من الحصول على أو تحديد سمة كائن.

g= Graphics() # create an object
# access the object's instance variables
print "screen", g.screen
g.screen= pygame.display.set_mode(SCREEN_SIZE, FULLSCREEN, 32)

لاحظ أننا إنشاء كائن (g) من طبقتنا (Graphics). نحن لا ترجع الطبقة في كثير من الأحيان على الإطلاق. تقريبا المرة الوحيدة يستخدم اسم فئة هو إنشاء مثيلات الكائن (Graphics()). نحن نادرا ما يقول Graphics.this أو Graphics.that للإشارة إلى سمات الفئة نفسها.

نصائح أخرى

وأنا أفكر أن شرحا موجزا عن الفرق بين الفئة و المثيل سمات في بيثون قد تكون مفيدة لك.

عند كتابة التعليمات البرمجية مثل ذلك:

class Graphics:
    screen_size = (1024, 768)

ووGraphics الطبقة هو في الواقع الكائن نفسه - كائن فئة. لأنك تعرف screen_size داخل منه، screen_size هو سمة من سمات الكائن Graphics. يمكنك ان ترى ذلك في ما يلي:

assert Graphics.screen_size == (1024, 768)

في بيثون، هذه الكائنات الطبقة يمكن استخدام مثل وظائف - فقط استخدم بناء الجملة الاحتجاج:

g = Graphics()

ويسمى g "مثيل" من Graphics الصف. عند إنشاء مثيلات فئة، كل تنسب عمليات البحث التي لا تتطابق مع سمات المثال تبدو في سمات كائن الفئة المقبل. لهذا السبب يعمل هذا البحث:

assert g.screen_size == (1024, 768)

إذا أضفنا سمة إلى <م> المثال بنفس الاسم، ومع ذلك، فإن البحث على سبيل المثال لن تنجح، وأنه لن يكون لتذهب بحثا عن كائن الفئة. كنت في الأساس "قناع" قيمة كائن الفئة مع قيمة تعيين مباشرة على سبيل المثال. لاحظ أن هذا <م> لا تغيير قيمة السمة في كائن الفئة:

g.screen_size = (1400, 1050)
assert g.screen_size == (1400, 1050)
assert Graphics.screen_size == (1024, 768)

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

class Graphics:

    screen_size = (1024, 768)

    def __init__(self):
        self.screen_size = (1400, 1050)

g = Graphics()
assert Graphics.screen_size == (1024, 768)
assert g.screen_size == (1400, 1050)

ويمكن استخدام Graphics.screen_size قيمة في أي مكان بعد هذا تعريف الفئة، كما هو موضح مع بيان ASSERT الأول في المقتطف أعلاه.

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

وانها على الأرجح نوع object ذلك

self.screen = object()

ويمكن أن تعمل (إذا كنت قد فهمت سؤالك بشكل صحيح).

ولاف ... PEBKAC.

وأنا معتاد جدا لC أن أظل نسيان يمكنك أن تفعل أكثر من النموذج الأولي خارج للتو من defs.

وأعيد كتابة هذا كما وانها عملت:

class graphics:
SCREEN_SIZE = (640, 480)
screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32)
def __init__(self, Fullscreen = False, Width = 640, Height = 480):
    print "Graphics Init"
    self.SCREEN_SIZE = (Width, Height)
    pygame.init()
    if Fullscreen:
        self.screen = pygame.display.set_mode(SCREEN_SIZE, FULLSCREEN, 32)
        print "Fullscreen Initialized"
    else:
        self.screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32)
        print "Non-Fullscreen Initialized"
scroll top