Таким образом, почти каждый ответ здесь, кажется, пропустит конкретный момент. Переменные класса никогда не становятся переменными экземпляра, как показано в приведенном ниже коде. Используя метакласс, чтобы перехватить присвоение переменной на уровне класса, мы видим, что когда a.myattr переназначается, магия метода назначения полей в классе не вызывается. Это связано с тем, что присваивание создает новую переменную экземпляра. Это поведение абсолютно не имеет ничего общего с переменной класса, как показано вторым классом, который не имеет переменных класса и все же допускает присвоение поля.
class mymeta(type):
def __init__(cls, name, bases, d):
pass
def __setattr__(cls, attr, value):
print("setting " + attr)
super(mymeta, cls).__setattr__(attr, value)
class myclass(object):
__metaclass__ = mymeta
myattr = []
a = myclass()
a.myattr = [] #NOTHING IS PRINTED
myclass.myattr = [5] #change is printed here
b = myclass()
print(b.myattr) #pass through lookup on the base class
class expando(object):
pass
a = expando()
a.random = 5 #no class variable required
print(a.random) #but it still works
IN SHORT Переменные класса НИЧЕГО НЕ делают с переменными экземпляра .
Более ясно. Они просто попадают в область поиска по экземплярам. Переменные класса фактически являются переменными экземпляра для самого объекта класса. Вы также можете иметь метаклассивные переменные , если хотите, а также потому, что сами метаклассы тоже являются объектами. Все это объект, независимо от того, используется ли он для создания других объектов или нет, поэтому не следует привязывать семантику использования других слов в классе слов. В python класс - это просто объект, который используется для определения того, как создавать другие объекты и каковы их поведение. Метаклассы - это классы, которые создают классы, чтобы еще раз проиллюстрировать этот момент.
R
по умолчанию использует стандарт регулярных выражений POSIX
(Portable Operating System Interface) (см. эти сообщения SO [ 1 , 2 ] и ?regex
[ caveat emptor : плотность уровня мачете]].
Взгляд вперед ((?=...)
), look-behind ((?<=...)
) и их отрицания ((?!...)
] и (?<!...)
), вероятно, являются наиболее яркими примерами форматов PCRE
-специфических (Perl-совместимых регулярных выражений), которые не совместимы с POSIX
.
R
можно обучить понять ваше регулярное выражение, активировав опцию perl
на TRUE
; эта опция доступна во всех функциях регулярного выражения base
(gsub
, grepl
, regmatches
и т. д.):
output <- sub("\\?(?=([^'\\\\]*(\\\\.|'([^'\\\\]*\\\\.)*[^'\\\\]*'))*[^']*$)",
"!", "This is a test string?", perl = TRUE)