修改了Python属性和Python属性setter类型

时间:2016-10-25 16:34:21

标签: python python-2.7 python-3.x

我是一名python初学者,我被困在@property和@property中。二传手装饰。 我想使用setter将一些数据添加到名为__content的字典中。 这是我的尝试,但是当我运行这个脚本时,只有最后一个元素被添加到字典中! 那么我在这里错过了什么!

class Something:
    def __init__(self,elem):
        self.__content={}

        self.__content.update(elem)
        print type(self.__content)

    @property
    def content(self):
        return self.__content

    @content.setter
    def content(self,elem):
        self.__content.update(elem)

并且

from transpose import Something
c=Something(dict(one=4))
print c.content
c.content=dict(two=6)
print c.content

结果

/usr/bin/python /home/radouani/PycharmProjects/demoPython/test.py
<type 'dict'>
{'one': 4}
<type 'dict'>
{'two': 6}
 Process finished with exit code 0

另一个问题:当我尝试使用setter影响元组或整数时,我不明白为什么python会改变__content的类型?

亲切

2 个答案:

答案 0 :(得分:3)

属性不适用于旧式类。您必须从object继承以创建新的样式类:

class Something(object):
    ...

来自property doc

  

class property([fget[, fset[, fdel[, doc]]]])

     

返回new-style class es的属性属性(从对象派生的类)。

答案 1 :(得分:1)

如前所述,属性不适用于“旧式”类。您必须继承object以在Python 2.x中创建一个新的样式类,以使属性能够工作。

class Something(object):
    #stuff

在Python 3.x中,这将会发生 - Python3中的所有类都是“新风格”类。 “New Style”类也在Python2中实现,但是因为它会改变“旧式”类的功能,所以你必须通过继承object来“选择”在Python2中使用New Style类。

即使这在Python3中隐式地自动发生,但仍然首选,但不是必需的,您明确地从object继承这一继承以实现向后兼容。

开发课程的绝佳资源:Raymond Hettinger - Python's Class Development Toolkit