Возьмем простой векторный класс:
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
Мы хотим иметь метод, который вычисляет длину. Как бы это выглядело, если бы мы хотели определить его внутри класса?
def length(self):
return math.sqrt(self.x ** 2 + self.y ** 2)
Как это должно выглядеть, когда мы должны определять его как глобальный метод / функцию?
def length_global(vector):
return math.sqrt(vector.x ** 2 + vector.y ** 2)
Таким образом, вся структура остается прежней. Как я могу это использовать? Если на какой-то момент мы предположим, что мы не записали метод length
для нашего класса Vector
, мы могли бы это сделать:
Vector.length_new = length_global
v = Vector(3, 4)
print(v.length_new()) # 5.0
Это работает, потому что первый параметр length_global
, может быть повторно использован как параметр self
в length_new
. Это было бы невозможно без явного self
.
Другой способ понять необходимость явного self
- увидеть, где Python добавляет некоторый синтаксический сахар. Когда вы помните, что в основном вызов, подобный
v_instance.length()
, внутренне преобразован в
Vector.length(v_instance)
, легко увидеть, где находится self
. на самом деле не пишите методы экземпляра в Python; то, что вы пишете, это методы класса, которые должны принимать экземпляр в качестве первого параметра. И поэтому вам нужно будет явно указать параметр экземпляра.
float x=1.1;
while (x==1.1)
float и double variables не способны хранить точное значение 1.1, только очень близкое приближение. Точное значение в float и double будет немного отличаться из-за разницы в точности.
1.1 является значением double . Вы храните 1.1 как двойной в поплавок, который немного изменит значение. Затем вы сравниваете его с двойным значением 1.1, поэтому он не будет равным и никогда не войдет в ваше состояние.
Для этого вам нужно написать 1.1f, чтобы убедиться, что вы работаете с тем же тип данных везде. Кроме того, я уверен, что кто-то еще объяснит, почему сравнение значений с плавающей точкой для точного равенства часто является плохой идеей.