Что такое атрибуты в.NET?

Чтобы выбрать строки, значение столбца которых равно скаляру, some_value, используйте ==:

df.loc[df['column_name'] == some_value]

Чтобы выбрать строки, значение столбца которых в итерабельном, some_values, используйте isin:

df.loc[df['column_name'].isin(some_values)]

Объединить несколько условий с &:

df.loc[(df['column_name'] == some_value) & df['other_column'].isin(some_values)]

Выбрать строки, значение столбца не равно some_value, используйте !=:

df.loc[df['column_name'] != some_value]

isin возвращает булевскую серию, поэтому для выбора строк, значение которых не в some_values, отмените булевскую серию используя ~:

df.loc[~df['column_name'].isin(some_values)]

Например,

import pandas as pd
import numpy as np
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
                   'B': 'one one two three two two one three'.split(),
                   'C': np.arange(8), 'D': np.arange(8) * 2})
print(df)
#      A      B  C   D
# 0  foo    one  0   0
# 1  bar    one  1   2
# 2  foo    two  2   4
# 3  bar  three  3   6
# 4  foo    two  4   8
# 5  bar    two  5  10
# 6  foo    one  6  12
# 7  foo  three  7  14

print(df.loc[df['A'] == 'foo'])

дает

     A      B  C   D
0  foo    one  0   0
2  foo    two  2   4
4  foo    two  4   8
6  foo    one  6  12
7  foo  three  7  14

Если у вас несколько значений вы хотите включить, поместить их в список (или, в более общем плане, любой итерабельный) и использовать isin:

print(df.loc[df['B'].isin(['one','three'])])

дает

     A      B  C   D
0  foo    one  0   0
1  bar    one  1   2
3  bar  three  3   6
6  foo    one  6  12
7  foo  three  7  14

Примечание, однако, если вы хотите сделать это много раз, более эффективно сначала сделать индекс, а затем использовать df.loc:

df = df.set_index(['B'])
print(df.loc['one'])

дает

       A  C   D
B              
one  foo  0   0
one  bar  1   2
one  foo  6  12

или, чтобы включить несколько значений из использования индекса df.index.isin:

df.loc[df.index.isin(['one','two'])]

дает

       A  C   D
B              
one  foo  0   0
one  bar  1   2
two  foo  2   4
two  foo  4   8
two  bar  5  10
one  foo  6  12
202
задан Peter Mortensen 18 April 2017 в 09:58
поделиться

11 ответов

Метаданные. Данные о Ваших объектах/методах/свойствах.

, Например, я мог бы объявить названный Атрибут: DisplayOrder, таким образом, я могу легко управлять в том, какие свойства порядка должны появиться в UI. Я мог тогда добавить его к классу и записать некоторые компоненты графического интерфейса пользователя, которые извлекают атрибуты и заказывают элементы UI соответственно.

public class DisplayWrapper
{
    private UnderlyingClass underlyingObject;

    public DisplayWrapper(UnderlyingClass u)
    {
        underlyingObject = u;
    }

    [DisplayOrder(1)]
    public int SomeInt
    {
        get
        {
            return underlyingObject .SomeInt;
        }
    }

    [DisplayOrder(2)]
    public DateTime SomeDate
    {
        get
        {
            return underlyingObject .SomeDate;
        }
    }
}

, Таким образом, обеспечение, что SomeInt всегда отображается перед SomeDate при работе с моими пользовательскими компонентами графического интерфейса пользователя.

Однако Вы будете видеть их обычно используемый за пределами прямой среды программирования. Например, Windows Designer использует их экстенсивно, таким образом, он знает, как иметь дело с изготовленными на заказ объектами. Используя BrowsableAttribute как так:

[Browsable(false)]
public SomeCustomType DontShowThisInTheDesigner
{
    get{/*do something*/}
}

Говорит разработчику не перечислять это в доступных свойствах в Окне свойств во время проектирования, например.

Вы могли также использовать их для генерации кода, предварительно компилировать операции (такие как Пост-Sharp) или операции во время выполнения, такие как Отражение. Испустить. Например, Вы могли записать немного кода для профилирования, которое прозрачно обернуло каждый вызов, который Ваш код выполняет и времена это. Вы могли "уклонение" синхронизации через атрибут, который Вы помещаете в конкретные методы.

public void SomeProfilingMethod(MethodInfo targetMethod, object target, params object[] args)
{
    bool time = true;
    foreach (Attribute a in target.GetCustomAttributes())
    {
        if (a.GetType() is NoTimingAttribute)
        {
            time = false;
            break;
        }
    }
    if (time)
    {
        StopWatch stopWatch = new StopWatch();
        stopWatch.Start();
        targetMethod.Invoke(target, args);
        stopWatch.Stop();
        HandleTimingOutput(targetMethod, stopWatch.Duration);
    }
    else
    {
        targetMethod.Invoke(target, args);
    }
}

Объявление их легко, просто сделайте класс, который наследовался Атрибуту.

public class DisplayOrderAttribute : Attribute
{
    private int order;

    public DisplayOrderAttribute(int order)
    {
        this.order = order;
    }

    public int Order
    {
        get { return order; }
    }
}

И помнят, что при использовании атрибута можно опустить "атрибут" суффикса, компилятор добавит это для Вас.

ПРИМЕЧАНИЕ: Атрибуты ничего не делают собой - должен быть некоторый другой код, который использует их. Иногда тот код был записан для Вас, но иногда необходимо записать его сами. Например, заботы о компиляторе C# о некоторых и определенных платформах платформ используют некоторых (например, NUnit ищет [TestFixture] на классе и [Тест] на методе тестирования при загрузке блока).
Поэтому при создании собственного атрибута знать, что это не повлияет на поведение кода вообще. Необходимо будет записать другую часть, которая проверяет атрибуты (через отражение) и действие на них.

143
ответ дан Quibblesome 23 November 2019 в 05:02
поделиться

Многие люди ответили, но никто не упомянул это до сих пор...

Атрибуты используются в большой степени с отражением. Отражение является уже довольно медленным.

Это очень стоящее маркировка Ваших пользовательских атрибутов, как являющихся sealed классы для улучшения их производительности во время выполнения.

Это - также хорошая идея рассмотреть, где было бы уместно использовать, помещают такой атрибут, и приписывать Ваш атрибут (!) для указания на это через AttributeUsage . Список доступных использований атрибута мог бы удивить Вас:

  • блок
  • Модуль
  • Структура Класса
  • Перечисление
  • Конструктор
  • Метод
  • Полевой
  • Интерфейс События
  • Свойства
  • Параметр
  • Делегат
  • ReturnValue
  • GenericParameter
  • Весь

также здорово, что атрибут AttributeUsage является частью подписи атрибута AttributeUsage. Стоп для круговых зависимостей!

[AttributeUsageAttribute(AttributeTargets.Class, Inherited = true)]
public sealed class AttributeUsageAttribute : Attribute
35
ответ дан Drew Noakes 23 November 2019 в 05:02
поделиться

Атрибуты являются своего рода метаданными для меток классов. Это часто используется в WinForms, например, для сокрытия средств управления от панели инструментов, но может быть реализовано в собственном приложении, чтобы позволить экземплярам различных классов вести себя в особенных методах.

Запускаются путем создания атрибута:

[AttributeUsage(AttributeTargets.Class, AllowMultiple=false, Inherited=true)]
public class SortOrderAttribute : Attribute
{
    public int SortOrder { get; set; }

    public SortOrderAttribute(int sortOrder)
    {
        this.SortOrder = sortOrder;
    }
}

Все классы атрибута должны иметь суффиксный "Атрибут", чтобы быть допустимыми.
После того, как это сделано, создайте класс, который использует атрибут.

[SortOrder(23)]
public class MyClass
{
    public MyClass()
    {
    }
}

Теперь можно проверить определенный класс SortOrderAttribute (если он имеет один) путем выполнения следующего:

public class MyInvestigatorClass
{
    public void InvestigateTheAttribute()
    {
        // Get the type object for the class that is using
        // the attribute.
        Type type = typeof(MyClass);

        // Get all custom attributes for the type.
        object[] attributes = type.GetCustomAttributes(
            typeof(SortOrderAttribute), true);

        // Now let's make sure that we got at least one attribute.
        if (attributes != null && attributes.Length > 0)
        {
            // Get the first attribute in the list of custom attributes
            // that is of the type "SortOrderAttribute". This should only
            // be one since we said "AllowMultiple=false".
            SortOrderAttribute attribute = 
                attributes[0] as SortOrderAttribute;

            // Now we can get the sort order for the class "MyClass".
            int sortOrder = attribute.SortOrder;
        }
    }
}

, Если Вы хотите читать больше об этом, можно всегда проверять MSDN, который имеет довольно хорошее описание.
я надеюсь, что это выручило Вас!

12
ответ дан meJustAndrew 23 November 2019 в 05:02
поделиться

Атрибут является классом, который содержит некоторый бит функциональности, что можно обратиться к объектам в коде. Для создания один создайте класс, который наследовался Системе. Атрибут.

Что касается того, для чего они хороши..., существует почти безграничное использование для них.

http://www.codeproject.com/KB/cs/dotnetattributes.aspx

4
ответ дан TheSmurf 23 November 2019 в 05:02
поделиться

Атрибуты похожи на метаданные, относился к классам, методам или блокам.

Они хороши для любого количества вещей (визуализация отладчика, отмечая вещи как устаревший, отмечая вещи как сериализуемые, список бесконечен).

Создание Ваших собственных легко как круг. Запустите здесь:

http://msdn.microsoft.com/en-us/library/sw480ze8 (По сравнению с 71) .aspx

4
ответ дан Stu 23 November 2019 в 05:02
поделиться

В проекте я в настоящее время продолжаю работать, существует ряд объектов пользовательского интерфейса различных ароматов и редактора к блоку эти объекты создать страницы для использования в главном приложении, немного как конструктор форм в DevStudio. Эти объекты существуют в своем собственном блоке, и каждый объект является классом, полученным от UserControl, и имеет пользовательский атрибут. Этот атрибут определяется как это:

[AttributeUsage (AttributeTargets::Class)]
public ref class ControlDescriptionAttribute : Attribute
{
public:
  ControlDescriptionAttribute (String ^name, String ^description) :
    _name (name),
    _description (description)
  {
  }

  property String ^Name
  {
    String ^get () { return _name; }
  }

  property String ^Description
  {
    String ^get () { return _description; }
  }

private:
  String
    ^ _name,
    ^ _description;
};

и я применяю его к классу как это:

[ControlDescription ("Pie Chart", "Displays a pie chart")]
public ref class PieControl sealed : UserControl
{
  // stuff
};

, который является тем, что сказали предыдущие плакаты.

Для использования атрибута редактор имеет Generic::List <Type> содержащий типы управления. Существует поле списка, от которого пользователь может перетащить и отбросить на страницу для создания экземпляра управления. Для заполнения поля списка я добираюсь ControlDescriptionAttribute для управления и заполняю запись в списке:

// done for each control type
array <Object ^>
  // get all the custom attributes
  ^attributes = controltype->GetCustomAttributes (true);

Type
  // this is the one we're interested in
  ^attributetype = ECMMainPageDisplay::ControlDescriptionAttribute::typeid;

// iterate over the custom attributes
for each (Object ^attribute in attributes)
{
  if (attributetype->IsInstanceOfType (attribute))
  {
    ECMMainPageDisplay::ControlDescriptionAttribute
      ^description = safe_cast <ECMMainPageDisplay::ControlDescriptionAttribute ^> (attribute);

    // get the name and description and create an entry in the list
    ListViewItem
      ^item = gcnew ListViewItem (description->Name);

    item->Tag = controltype->Name;
    item->SubItems->Add (description->Description);

    mcontrols->Items->Add (item);
    break;
  }
}

Примечание: вышеупомянутое является C++ / CLI, но не трудно преобразовать в C# (да, я знаю, C++ / CLI является отвращением, но это - то, что я должен работать с:-()

, можно поместить атрибуты на большинство вещей и существует целый диапазон предопределенных атрибутов. Редактор упомянул выше, также ищет пользовательские атрибуты на свойствах, которые описывают свойство и как отредактировать его.

, Как только Вы получаете всю эту мысль, Вы зададитесь вопросом, как Вы когда-либо жили без них.

4
ответ дан Tim Cooper 23 November 2019 в 05:02
поделиться

Как сказано, Атрибуты относительно легко создать. Другая часть работы создает код, который использует его. В большинстве случаев Вы будете использовать отражение во времени выполнения для изменения поведения на основе присутствия атрибута или его свойств. Существуют также сценарии, где Вы осмотрите атрибуты на скомпилированном коде, чтобы сделать своего рода статический анализ. Например, параметры могли бы быть отмечены как непустой указатель, и аналитический инструмент может использовать это в качестве подсказки.

Используя атрибуты и знание соответствующих сценариев для их использования объем работы.

3
ответ дан denis phillips 23 November 2019 в 05:02
поделиться

Атрибуты являются, по существу, битами данных, которые Вы хотите присоединить к Вашему типы (классы, методы, события, перечисления, и т.д.)

, идея состоит в том, что во время выполнения некоторый другой тип/платформа/инструмент будет запрашивать Ваш тип для получения информации в атрибуте и реагировать на них.

Так, например, Visual Studio может запросить атрибуты на стороннем управлении для выяснения, какие свойства управления должны появиться в области Properties во время проектирования.

Атрибуты могут также использоваться в Аспектно-ориентированном программировании для введения/управления объектов во время выполнения на основе атрибутов, которые украшают их и добавляют проверку, вход, и т.д. к объектам, не влияя на бизнес-логику объекта.

3
ответ дан urini 23 November 2019 в 05:02
поделиться

Можно использовать пользовательские атрибуты в качестве простого способа определить значения тега в sub классах, не имея необходимость писать тот же код много раз для каждого подкласса. Я столкнулся с хорошим краткий пример John Waters из как определить и использовать пользовательские атрибуты в Вашем собственном коде.

существует учебное руководство в http://msdn.microsoft.com/en-us/library/aa288454 (По сравнению с 71) .aspx

2
ответ дан Chris Miller 23 November 2019 в 05:02
поделиться

Чтобы начать создавать атрибут, откройте исходный файл C#, тип attribute и совершите нападки [ВКЛАДКА]. Это расширится до шаблона для нового атрибута.

2
ответ дан Jay Bazuzi 23 November 2019 в 05:02
поделиться

Атрибуты также часто используются для аспектно-ориентированного программирования. Для примера посмотрите проект PostSharp .

1
ответ дан 23 November 2019 в 05:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: