top of page

רעננו את הדף והקליקו למעבר לנושא הבא:

טיפול ב-attributes

  • Feb 9, 2019
  • 2 min read

טיפול ב-attributes

__getattr__, __setattr__ , __delattr__

לאובייקט שאנו מייצרים במחלקה ישנן attribuetes או אם תרצו, תכונות. לעיתים נרצה לטפל בתכונות הללו או ליתר דיוק באפשרות לעשות בהן שימוש או למחוק אותן מהאובייקט.


class MyAttributes: def __init__(self): self.data = {'a': 'alfa', 'b': 'beta'} def __getattr__(self, attr): return self.data[attr] obj = MyAttributes() d=obj.a print(d)

>>>

alfa

בדוגמא למעלה, אנו מעבירים במסגרת המתודה המיוחדת __init__ שורה של תכונות (attributes) בתוך מילון. תכונה a היא alfa תכונה b היא beta. כדי להגיע לתכונה מסוימת דווקא ברשימת התכונות, אנו נזקקים ל- __getattr__ ולאחר ששיבצנו את המתודה במחלקה שלנו אנו יכולים לגשת לתכונה מסוימת ולראות אותה.

כאשר אנו רוצים להוסיף באותו אופן תכונה נוספת לרשימה שלנו שתגיב ל- obj.c שעדיין לא קיימת, הדברים מעט מסתבכים, קחו אוויר, וננסה להסביר מה עושה המתודה המיוחדת __setattr__ ולמה זה יותר מסובך. פייתון משתמשת באותה שיטה כדי לבצע השמה של attribute ולכן שימוש אינטואיטיבי בפונקציה מהצורה self.data[key]=value כאשר מתודת __init__ נותרת כפי שהיא - יגרום לרקורסיה אינסופית - ()__setattr__ תקרא לעצמה....

לבעיה הזאת יש כמה פתרונות – שהבא מביניהם נראה לי יותר אלגנטי והוא גם קרוי בפייתון new style כך שאין מצב למשהו ב- old style.


class MyAttributes: def __init__(self): object.__setattr__(self,"data", {'a': 'alfa', 'b': 'beta'}) def __getattr__(self, key): return self.data[key] def __setattr__(self, key, value): self.data[key]=value def __repr__(self): return f"{self.data}" obj = MyAttributes() obj.c="cool" print(obj)

אנו קוראים למחלקה הבסיסית באמצעות ()object.__setattr__ כדי לחמוק מ- ()__setattr__

והרקורסיה הכרוכה בו.


התוצאה

{'a': 'alfa', 'b': 'beta', 'c': 'cool'}

הצלחנו לשבץ תכונה חדשה תחת השם c, זה cool. בלי לגרום לרקורסיה אינסופית.

באותו אופן גם הטיפול ב- __delattr__ עובר באופן חלק – ואנו מצליחים למחוק תכונה מהמחלקה שלנו.


class MyAttributes: def __init__(self): object.__setattr__(self,"data", {'a': 'alfa', 'b': 'beta'}) def __getattr__(self, key): return self.data[key] def __setattr__(self, key, value): self.data[key]=value def __delattr__(self, key): del self.data[key] def __repr__(self): return f"{self.data}" obj = MyAttributes() obj.c="cool" del obj.a print(obj)

הנה, מחקנו attribute

התוצאה

{'b': 'beta', 'c': 'cool'}

 
 
 

Related Posts

See All
תוכן הקורס

לחץ למעבר לשיעור תוכן עניינים מבוא הורדה והתקנת התוכנה על גבי המחשב שלכם חלק ראשון - יסודות פקודת print מחרוזות - גרשיים (") או גרש (') פעולות מתמטיות בסיסיות סוגי מספרים - integer

 
 
 
מבוא

הרקע של פייתון - שפת התכנות פייתון (python) פותחה על ידי הולנדי בשם Guido van Rossum ונקראה בהומור על שם חבורות הקומיקאים הבריטית מונטי-פייתון, כאשר משמעות המילה פייתון כשלעצמה היא נחש חנק מסוג פיתון,

 
 
 
הורדה והתקנת פייתון על גבי המחשב שלכם

פייתון קיימת במערכות הפעלה של אפל ולינוקס ולא צריך להתקין אותה באופן מיוחד. לעומת זאת, במערכת ההפעלה של windows דרושה התקנה כפי שיפורט להלן. התוכנה, גם ל- windows, היא תוכנה חינמית וניתנת להורדה באתר

 
 
 

1 Comment


Commenting on this post isn't available anymore. Contact the site owner for more info.
Minh Ngo
Minh Ngo
Aug 27, 2025

Знаешь, как иногда бывает — делаешь какую-то глупость не потому, что сильно хотел, а просто потому, что выдался такой вечер. Скучный, дождливый, ничем не примечательный. Вот у меня так и вышло. Я вообще не любитель азартных игр, карты даже в «дурака» редко собираюсь, не то что во что-то серьезное. Но в тот вечер я допоздна засиделся за отчетами, голова гудела, нужно было как-то переключиться. И вот листаю я ленту в телефоне, вижу рекламу одного казино. Ну, думаю, посмотрю, что там да как, чисто из любопытства. Так мое первое знакомство с https://natureindeed.com платформой вавада началось с банальной скуки и усталости.

Зарегистрировался, нашел их приветственный бонус. Думал, там какие-то копейки, на которые даже крутить нечего. Ан нет, дали вполне себе нормальную сумму,…

Like
Single Post: Blog_Single_Post_Widget
bottom of page