Я использую pandas 0.14.1 на macos в ноутбуке ipython. Я попробовал предложенную строку выше:
df[df['A'].str.contains("Hello|Britain")]
и получил ошибку:
"cannot index with vector containing NA / NaN values"
, но она отлично работала, когда было добавлено условие «== Истина», например:
df[df['A'].str.contains("Hello|Britain")==True]
Нет никакого способа сделать это, кроме как просто следовать своему собственному соглашению и делать это. Если вам действительно нужно пройти через ваше публичное свойство.
Я не понимаю, почему вам нужно будет / хотеть сделать это, поскольку, поскольку это ваш внутренний класс, вы контролируете код, и вы можете определить, что / как он используется, поэтому не должно быть проблем.
Вы должны получить доступ к свойству только через общедоступное свойство Hello. Это и есть причина этого шаблона. Если вы добавите какие-либо функции в get или set, если вы обращаетесь к частному экземпляру, вы введете ошибки в свой код. Но anwer - НЕТ, вы не можете запретить кому-то звонить Частным, когда они находятся внутри вашего класса, изменяя ваш код.
_Prop
или что-то в этом роде.
– Steven Sudit
16 July 2010 в 15:22
Лично я не вижу ничего плохого в доступе к частному члену внутри класса. Фактически, это то, что я обычно делаю (если в составе свойства getter / setter нет логики, которую я всегда хочу использовать).
Это имеет смысл для меня: код внутри класса составляет реализация этого класса; зачем скрывать реализацию от себя?
Вот пример того, что я имею в виду. Предположим, что у меня есть член, m_denominator
, и я хочу, чтобы он никогда не был равен нулю:
private int m_denominator = 1;
public int Denominator
{
get { return m_denominator; }
set
{
if (value == 0)
throw new ArgumentException("Denominator must not be zero.");
m_denominator = value;
}
}
Я мог бы сказать себе: «Хорошо, везде я устанавливаю это значение в этом классе, я должен использовать Denominator
, чтобы убедиться, что я не устанавливаю его в ноль ». Но я полностью контролирую, что я устанавливаю Denominator
- я внутри класса! В сценарии этого точкой логики в свойстве Denominator
является защита класса от недопустимых значений, установленных клиентским кодом. Нет никакого оправдания для установки внутреннего состояния на какое-то недопустимое значение в реализации самого класса.
Конечно, это не абсолютное правило. Конечно, времена, когда использование свойства для его логики внутри класса может быть разумным выбором в качестве защитной меры; действительно, я просто утверждаю, что не ошибается для доступа к закрытым членам внутри класса.
Если вы обнаруживаете, что хотите скрыть детали от себя, это может быть запахом кода, который у вашего класса слишком много обязанностей. Подумайте об извлечении одной из обязанностей в новый класс.
Как и другие, это должно быть ответом ...
Вы можете использовать автоматические свойства в C # 3 при таргетинге на .NET 2.0 вместе с еще несколько других функций C # 3 . В отличие от (например) деревьев выражений, автоматическим свойствам не требуется ничего особенного из CLR или фреймворка, помимо атрибута [CompilerGenerated]
(который был введен в .NET 2.0).
Итак, если вы используя VS2008 или VS2010, тогда было бы полезно использовать автоматическое свойство.
Для чего это стоит, я бы тоже хотел эту способность. Я хотел бы иметь возможность переменные области видимости в свойстве:
public string Name
{
private string name;
get { return name; }
set { name = value; }
}
Я рассматриваю это как похожее на то, чтобы сделать частную переменную readonly - это не имеет никакого отношения к клиентам, но это помогает обеспечить правильность внутри сам код класса.
readonly
, сгенерированное компилятором.
– Jesse C. Slicer
21 August 2013 в 15:27
Нет. Любой метод внутри класса будет иметь доступ к обоим.
Ваша команда должна стандартизировать использование (свойство или приватная переменная).
Как только вы решите, что использовать, вы можете попробовать для использования стандартного правила FxCop для обеспечения соблюдения стандарта.
Нет, в принципе. Ну, вы могли бы что-то делать с предупреждениями компилятора через [Obsolete]
и #pragma
, но это было бы чрезмерно.
Вы могли бы , вероятно, сделать это с инструментами, но в конечном итоге вам нужно доверять людям, чтобы они не делали глупые вещи. В конце концов, есть ли у вас специальные правила:
while(true) { }
, или вы просто ставите это, чтобы «не быть глупым»? ; Р
while(true)
плюс break
внутри тела цикла является вполне допустимой конструкцией программирования. Есть намного хуже, чем это.
– user
16 July 2010 в 15:49
Вы можете выполнить это через наследование:
abstract class A // A is not instantiatable due to being abstract
{
private string m_hello = null;
public string Hello
{
get{return m_hello;}
set{m_hello = value;}
}
}
class B : A
{
// B now cannot access the private variable, use B in your code instead of A
}
Я не утверждаю, что это хорошо. Просто это можно сделать.