در مورد __getattr__

پرسیده شده
فعالیت 895 روز پیش
دیده شده 563 بار
0
class User:

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

    def __getattr__(self, item):
        print("__getattr__", item)
        return super().__setattr__(item, None)
        
if __name__ == "__main__":
    user = User("alireza", 20)
	print(user.car)

سلام،خسته نباشید..خواستم بدونم در این قطعه کدی که نوشتم در قسمت __getattr__ وقتی اجرا میشه که اتریبیوتی که بخوایم در کلاس نباشه و این رو فراخوانی میکنه،میخواستم بدونم چیجوری وقتی سوپر زده میشه با __setattr__ میاد تو کلاس یوزر یه اتریبیوتی به نام ایتم و مقدار None اضافه میکنه؟چون سوپر کلاس آبجکت صدا میزنه،برای مثال من اتریبیوت کار رو پرینت میکنم میره یه اتریبیوتی به نام کار در یوزر میسازه و مقدارش رو None قرار میده،اگه میشه لطفا راهنمایی کنید خیلی ممنون از شما.

فایل پیوست

علیرضا قرقابی
علیرضا قرقابی

20 آبان 00

0
حذف شده

سلاااااااااااااااااام علیرضا جان

خدا قوت

فک میکنم بیشتر در مورد متد __getattr__ ای که نوشتی سوال داری. در واقع خط ۹ کد که گذاشتی:

        return super().__setattr__(item, None)

خب super به کلاس پدر اشاره میکنه. و کلاس پدر User میشه object که متدی داره بنام __setattr__ (البته همه کلاس های پایتون این متد رو دارن چون همه از object ارث بری کردن)، کار متد __setattr__ اینه که یه اتربیوت ایجاد کنه و ۳ تا ورودی میگیره، ابجکت که به صورت خودکار پایتون پاس اش میده به این متد، اسم اتریبوت جدید و مقداری که میخواهیم برگردونه.

در واقع تو این خط ما داریم متد __setattr__ کلاس پدر کلاس User رو با ورودی هایی که گفتم صدا میزنیم و خب کاری که برامون میکنه همینه که میاد برامون اتربیوت جدیدی برای self ایجاد میکنه با اسم item که مقدار None رو برمیگردونه.

تو این تیکه کدی که نوشتی خط ۹ نیاز نبود از super استفاده کنی و کدت تمیزتر و درست تر بود اگر از self استفاده میکردی.

من دقیقا نمیدونم تو این تیکه کد میخواستی چیکار کنی و هدفت چی بوده. فک میکنم کد زیر یه مقدار تمیزتره.

class User:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __getattr__(self, item):
        self.__setattr__(item, None)
        print(f"There was no '{item}' attribute, So it was added.")  # FIXME: remove or comment me.
        return self.__getattribute__(item)


if __name__ == "__main__":
    user = User("alireza", 20)
    print(user.car)
    user.car = 'BMV'
    print(user.car)

میتونستیم هم کد زیر رو بنویسیم، ولی خب کد بالا تمیزتر هست.

class User:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __getattr__(self, item):
        setattr(self, item, None)
        print(f"There was no '{item}' attribute, So it was added.")  # FIXME: remove or comment me.
        return getattr(self, item)


if __name__ == "__main__":
    user = User("alireza", 20)
    print(user.car)
    user.car = 'BMV'
    print(user.car)

 

امیدوارم به جواب سوالت رسیده باشی.

فایل پیوست

محمدعلی رضا

توسط

محمدعلی رضا

21 آبان 00

0
حذف شده

خیلی ممنونم اقای محمدعلی،self رو فهمیدم که باید استفاده کنم،فقط بی زحمت یه سوال دیگه داشتم

class User:

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

    def __getattribute__(self, item):
        print("__getattribute__", item)
        return super().__getattribute__(item)

    def __getattr__(self, item):
        print("__getattr__", item)
        return self.__setattr__(item, None)
        
        
if __name__ == "__main__":
    user = User("alireza", 20)
    print(user.car)
    user.car = 'BMV'
    print(user.car)

 

تابع __getattribute__ موقع استفاده از هر متد و اتریبیوتی صدا زده میشه حتی اگه اون اتریبیوت و متد وجود نداشته باشه میخوام بگم در اینجا سوپر اگه صدا زده نشه و self به کار ببرم حلقه بی نهایت میخوره و برنامه از کار میوفته،میخوام بدونم چیجوری وقتی سوپر صدا زده میشه میره اون مقدار برمیگردونه چون ما در object چیزی ذخیره نکردیم؟؟چون پدر کلاس User همون objectهست،یعنی ما هر کلاسی درست میکنیم هر اتریبیوت و متدی تعریف میکنیم همون ها دقیقا در object هم ذخیره میشه؟اگه ممکنه راهنمایی کنید خیلییی ممنونم از شما 

فایل پیوست

علیرضا قرقابی

توسط

علیرضا قرقابی

21 آبان 00

حذف شده
این سوال ها و متن رو تو یه تاپیک جدید پرسیدی و اونجا جواب دادم. https://7learn.ac/community/%D8%AF%D8%B1-%D9%85%D9%88%D8%B1%D8%AF-getattribute--SEzC4
محمدعلی رضا

24 آبان 00