Разница между использованием __init__ и установкой переменной класса - PullRequest
3 голосов
/ 19 июня 2009

Я пытаюсь выучить дескрипторы, и меня смущает поведение объектов - в двух примерах ниже, как я понял __init__, они должны работать одинаково. Может ли кто-нибудь сбить меня с толку или указать источник, объясняющий это?

import math
class poweroftwo(object):
    """any time this is set with an int, turns it's value to a tuple of the int
    and the int^2"""
    def __init__(self, value=None, name="var"):
        self.val = (value, math.pow(value, 2))
        self.name = name

    def __set__(self, obj, val):
        print "SET"
        self.val = (val, math.pow(val, 2))
    def __get__(self, obj, objecttype):
        print "GET"
        return self.val

class powoftwotest(object):
    def __init__(self, value):
        self.x = poweroftwo(value)

class powoftwotest_two(object):
    x = poweroftwo(10)


>>> a = powoftwotest_two()
>>> b = powoftwotest(10)
>>> a.x == b.x
>>> GET
>>> False #Why not true? shouldn't both a.x and b.x be instances of poweroftwo with the same values?

1 Ответ

3 голосов
/ 19 июня 2009

Во-первых, пожалуйста, назовите все классы с помощью LeadingUpperCaseNames.

>>> a.x
GET
(10, 100.0)
>>> b.x
<__main__.poweroftwo object at 0x00C57D10>
>>> type(a.x)
GET
<type 'tuple'>
>>> type(b.x)
<class '__main__.poweroftwo'>

a.x - доступ на уровне экземпляра, который поддерживает дескрипторы. Это то, что подразумевается в разделе 3.4.2.2 «(так называемый класс дескриптора) появляется в словаре классов другого класса нового стиля». К словарю классов должен обращаться экземпляр, чтобы использовать методы __get__ и __set__.

b.x - доступ на уровне класса, который не поддерживает дескрипторы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...