Как можно автоматически обновлять переменные класса в python? - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь автоматически обновить переменные класса, которые находятся в отношении исправления. Например,

class vector:
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z
        self.r = (x**2+y**2+z**2)**0.5
        self.theta = tan((x**2+y**2)**0.5/z)
        self.phi = tan(y/x)

Если я изменю значение x экземпляра этого класса, я хочу автоматически обновить радиус и углы. И если я изменю угол или радиус, я хочу автоматически обновить компоненты x, y, z. Есть ли способ сделать это?

Изменить: Хорошо, теперь у меня есть следующее решение. Пожалуйста, поправьте меня, если есть ошибка или неточность в том, что я сделал.

from math import tan, cos, sin

class Vector:
    def __init__(self, x, y, z):
        self._x = x
        self._y = y
        self._z = z
        self._r = (self._x**2+self._y**2+self._z**2)**0.5
        self._theta = tan((self._x**2+self._y**2)**0.5/self._z)
        self._phi = tan(self._y/self._x)

    @property
    def x(self):
        return self._x
    @x.setter
    def x(self, new_x):
        self._x = new_x
        self._r = (self._x**2+self._y**2+self._z**2)**0.5
        self._theta = tan((self._x**2+self._y**2)**0.5/self._z)
        self._phi = tan(self._y/self._x)

    @property
    def y(self):
        return self._y

    @y.setter
    def y(self, new_y):
        self._y = new_y
        self._r = (self._x**2+self._y**2+self._z**2)**0.5
        self._theta = tan((self._x**2+self._y**2)**0.5/self._z)
        self._phi = tan(self._y/self._x)

    @property
    def z(self):
        return self._z

    @z.setter
    def z(self, new_z):
        self._z = new_z
        self._r = (self.x**2+self.y**2+self.z**2)**0.5
        self._theta = tan((self._x**2+self._y**2)**0.5/self._z)
        self._phi = tan(self._y/self._x)

    @property
    def r(self):
        return (self._x**2+self._y**2+self._z**2)**0.5

    @r.setter
    def r(self, new_r):
        self._r = new_r
        self._x = self._r*cos(self._theta)*cos(self._phi)
        self._y = self._r*cos(self._theta)*sin(self._phi)
        self._z = self._r*sin(self._theta)

    @property
    def theta(self):
        return tan((self._x**2+self._y**2)**0.5/self._z)

    @theta.setter
    def theta(self, new_theta):
        self._theta = new_theta
        self._x = self._r*cos(self._theta)*cos(self._phi)
        self._y = self._r*cos(self._theta)*sin(self._phi)
        self._z = self._r*sin(self._theta)

    @property
    def phi(self):
        return tan(self._y/self._x)

    @phi.setter
    def phi(self,new_phi):
        self._phi = new_phi
        self._x = self._r*cos(self._theta)*cos(self._phi)
        self._y = self._r*cos(self._theta)*sin(self._phi)
        self._z = self._r*sin(self._theta)

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

Вы ищете декоратор @property, который устанавливает переменную объекта с помощью оператора функции.

from math import tan

class Vector:
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

    @property
    def r(self):
        return (self.x**2+self.y**2+self.z**2)**0.5

    @property
    def theta(self):
        return tan((self.x**2+self.y**2)**0.5/self.z)

    @property
    def phi(self):
        return tan(self.y/self.x)

Следовательно,

v = Vector(1, 2, 3)
v.phi # -2.185039863261519
1 голос
/ 29 мая 2020

Вы можете переписать свой класс, как показано ниже

import math

class Vector:
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

    @property
    def radius(self):
        return (self.x**2+self.y**2+self.z**2)**0.5

    @property
    def theta(self):
        return math.tan((self.x**2+self.y**2)**0.5/self.z)

    @property
    def phi(self):
        return math.tan(self.y/self.x)

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