python 自动更新程序,在Python Class对象,如何自动更新属性?

I have a class which has multiple attributes that are related, for example:

class SomeClass:

def __init__(self, n=0):

self.list = range(n)

self.listsquare = [ x**2 for x in self.a ]

If I make an object normally that would no problem, with

a = SomeClass(10)

I will get 2 lists, a.list and a.listsquare.

Now if I want to make a empty object first, and assign one attribute to it, I want the other attributes to be automatically updated, for example if I do

b = SomeClass()

b.list = range(5,10)

I want b.listsquare to be automatically updated, and also the other way around (assign b.listsquare and auto update b.list). Is this possible? Is Class the right choice for this?

Thanks to you all, but I'm completely overwhelmed by all the different answers. Can anyone give a complete solution so I can learn write my own?

I would like to achieve a class Foo with 3 attributes length, list and listsquare such that:

If I do a = Foo(3), I get a.length = 3, a.list = [0, 1, 2], a.listsquare = [0, 1, 4].

If I do b = Foo().list = [5, 6], I get b.length = 2, b.listsquare = [25, 36].

If I do c = Foo().listsquare = [4, 9], I get c.length = 2, c.list = [2, 3].

解决方案

if updating one property due to an update on another property is what you're looking for (instead of recomputing the value of the downstream property on access) use property setters:

class SomeClass(object):

def __init__(self, n):

self.list = range(0, n)

@property

def list(self):

return self._list

@list.setter

def list(self, val):

self._list = val

self._listsquare = [x**2 for x in self._list ]

@property

def listsquare(self):

return self._listsquare

@listsquare.setter

def listsquare(self, val):

self.list = [int(pow(x, 0.5)) for x in val]

>>> c = SomeClass(5)

>>> c.listsquare

[0, 1, 4, 9, 16]

>>> c.list

[0, 1, 2, 3, 4]

>>> c.list = range(0,6)

>>> c.list

[0, 1, 2, 3, 4, 5]

>>> c.listsquare

[0, 1, 4, 9, 16, 25]

>>> c.listsquare = [x**2 for x in range(0,10)]

>>> c.list

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值