Вы не можете с конкретным синтаксисом, который вы описываете, из-за времени, когда они оцениваются. Причина, по которой приведенная в примере функция работает, заключается в том, что вызов функции f (i-1) внутри тела функции заключается в том, что разрешение имени f не выполняется до тех пор, пока функция не будет фактически называется. В этот момент f существует в рамках выполнения, так как функция уже была оценена. В случае примера класса ссылка на имя класса просматривается во время определения определения класса. Таким образом, он еще не существует в локальном масштабе.
В качестве альтернативы желаемое поведение может быть выполнено с использованием метакласса, подобного такому:
class MetaA(type):
def __init__(cls):
some_func(cls)
class A(object):
__metaclass__=MetaA
# do something
# ...
Используя этот подход, вы можете выполнять произвольные операции над объектом класса в то время, когда класс оценены.
float
и double
плавание двоичный файл типы точки . Другими словами, они представляют число как это:
10001.10010110011
двоичное число и местоположение двоичной точки оба кодируются в значении.
decimal
плавание десятичное число тип точки. Другими словами, они представляют число как это:
12345.65789
Снова, число и местоположение десятичное число точка оба кодируется в значении †“, это - то, что делает decimal
все еще тип с плавающей точкой вместо типа фиксированной точки.
важная вещь отметить состоит в том, что люди привыкли представлять нецелые числа в десятичной форме и ожидают точные результаты в десятичных представлениях; не все десятичные числа являются точно представимыми в двоичной плавающей точке †“0.1, например, †“поэтому при использовании двоичного значения с плавающей точкой, Вы на самом деле получите приближение к 0,1. Вы все еще получите приближения, когда использование плавающей десятичной точки также †“результат деления 1 на 3 не может быть точно представлено, например.
Что касается того, что использовать когда:
Для значений, которые являются "естественно точными десятичными числами", хорошо использовать decimal
. Это обычно подходит для любых понятий, изобретенных людьми: финансовые значения являются самым очевидным примером, но также существуют другие. Считайте счет данным дайверам или конькобежцам, например.
Для значений, которые являются большим количеством артефактов природы, которая не может действительно измеряться точно так или иначе, float
/ double
, являются более соответствующими. Например, научные данные были бы обычно представлены в этой форме. Здесь, исходные значения не будут "по десятичной системе точны" для начала, таким образом, для ожидаемых результатов не будет важно поддержать "десятичную точность". Плавающие типы двоичной точки намного быстрее для работы с, чем десятичные числа.
Точность является основным различием.
Плавание - 7 цифр (32 бита)
Двойной -15-16 цифр (64 бита)
Десятичное число -28-29 значащих цифр (128 битов)
Десятичные числа имеют намного более высокую точность и обычно используются в рамках финансовых приложений, которые требуют высокой степени точности. Десятичные числа намного медленнее (до 20X времена в некоторых тестах), чем двойное/плавающее.
Десятичные числа и Плавают/Удваивают, не может быть сравнен без броска, тогда как Плавания и Удваиваются, может. Десятичные числа также позволяют кодирование или конечные нули.
float flt = 1F/3;
double dbl = 1D/3;
decimal dcm = 1M/3;
Console.WriteLine("float: {0} double: {1} decimal: {2}", flt, dbl, dcm);
Результат:
float: 0.3333333
double: 0.333333333333333
decimal: 0.3333333333333333333333333333