Hello

From python version 3.6, there is a useful new method
__set_name__ which could be implemented in descriptors.

This method is called after a descriptor is instantiated
in a class. Parameter "name" is filled with the name
of the attribute refering to the descriptor in the class

Here is an example:

class Descriptor:
    def __set_name__(self, owner, name):
        print(name)

class A:
    value = Descriptor()


value    ## produced by print in Descriptor


-----------------

But I discovered that __set_name__ is not called immediately
after the execution of line "value = Descriptor()" but after
all class code execution ...

Here is an other example:

class Descriptor:
    def __set_name__(self, owner, name):
        print("From Descriptor's method __set_name__: ", name)

                
class Test:
    aaa = Descriptor()
    print("From class Test")

From class Test
From Descriptor's method __set_name__:  aaa
>>>

As you see, the print from __set_name__ occurs AFTER the print
from the class, I think every body was expecting the print
from __set_name__ before.

It is annoying in some real life, when one descriptor's method
is a decorator and you write things like:


class Temperature:
    def __init__(self):
        self.celsius= 0

    fahrenheit = my_property()

    @fahrenheit.getter
    def fahrenheit(self):
        return 1.8*self.celsius+ 32

    @fahrenheit.setter
    def fahrenheit(self, value):
        self.celsius= (value -32)/1.8

and fahrenheit.getter is expecting an attribute in fahrenheit which
has not been set yet, it will be after all Temperature class code
execution ...









--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to