On 19/10/2023 18.29, Dom Grigonis wrote:
def  __get__(self, instance, owner):
def  __set__(self, instance, value):

Is there a reason why `__set__` does not have owner in it’s arguments while `__get__` does?

Is this a Python Idea?

You may have only given us a couple of lines, when the scope of the question is much wider...

Be careful because these mechanisms were updated relatively-recently - and thus there are differences between Python versions!


From my notes (please see code-example which appears to answer your question):

The __set_name__() method is a special method in Python that is used in the context of descriptors. It was introduced in Python 3.6 as a part of the Descriptor Protocol.

The purpose of the __set_name__() method is to allow descriptors to automatically determine and store the name of the attribute they are assigned to within the class. This method is called once during the creation of the descriptor instance, and it receives two arguments: the owner class and the name of the attribute.

By implementing the __set_name__() method in a descriptor, you can access and store the name of the attribute to which the descriptor is assigned. This can be useful when you want to associate the descriptor with the attribute name or perform any additional setup based on the attribute name.

Here's an example to illustrate the usage of __set_name__():

```python
class Descriptor:
    def __set_name__(self, owner, name):
        self.name = name

    def __get__(self, instance, owner):
        if instance is None:
            return self
        return instance.__dict__.get(self.name)

    def __set__(self, instance, value):
        instance.__dict__[self.name] = value

class MyClass:
    attribute = Descriptor()

obj = MyClass()
obj.attribute = 42
print(obj.attribute)  # Output: 42
```

In the above code, the Descriptor class defines the __set_name__() method. When the attribute descriptor is assigned to the attribute attribute of the MyClass class, the __set_name__() method is automatically called with the owner class (MyClass) and the attribute name (attribute). Inside this method, we store the attribute name in the descriptor instance.

Later, when we set obj.attribute = 42, the descriptor's __set__() method is called, and the value is stored in the instance's __dict__ attribute using the previously stored attribute name.

By using __set_name__(), descriptors can dynamically associate themselves with the attribute names they are assigned to, providing more flexibility and customization.


Web.Refs:
https://docs.python.org/3/howto/descriptor.html
https://docs.python.org/3/reference/datamodel.html#descriptors

--
Regards,
=dn
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/L7WZA7GEW3TPYUA4NF6POHDL2FSF5TIY/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to