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