

オブジェクト指向プログラミングにおいて、属性とは、オブジェクト、要素、またはファイルのプロパティを定義する仕様です。また、特定のインスタンスに対して特定の値を参照したり設定したりすることもできます。明確にするために、属性はメタデータと考える方がより適切です。属性は、多くの場合、プロパティのプロパティです。ただし、実際の使用においては、議論されているテクノロジーによっては、属性という用語はプロパティと同等に扱われることがよくあります。オブジェクトの属性は通常、名前と値で構成されます。要素の場合、これらは型とクラス名であり、ファイルの場合、これらはそれぞれ名前と拡張子です。
画像ファイル形式(例えばJPEG、PNG、BMPなど)は、同じ操作でデコードされるわけではありません(画像がどれほど似ていても、これらはすべてグラフィックデータ形式です)。同様に、プログラミング言語も、浮動小数点型の数値と長整数型を評価する際に同じ操作を使用するわけではありません。
例えば、コンピュータグラフィックスでは、線オブジェクトには、太さ(実数値)、色(茶色や緑などの記述的な値、またはRGBなどの特定のカラーモデルで定義された値)、破線属性などの属性を設定できます。円オブジェクトも同様の属性に加え、原点と半径で定義できます。コンピュータシステムにおいては、属性は特に読み取りまたは書き込み属性として定義され、特定の読み取りまたは書き込みに対応します。
CUSTOMER_NAME問題の要素が別のエンティティ(たとえば)のプロパティ()とみなせる場合CUSTOMER、その要素はゼロ個以上の独自の属性(プロパティ)を持つことができます(CUSTOMER_NAMEはのですTYPE = "KINDOFTEXT")。
C言語はC++11に続いてC23で属性を導入した。 [ 1 ]
[[ nodiscard ]] int add ( int a , int b , [[ maybe_unused ]] int c ) { return a + b ; }C++は属性と注釈の両方をサポートしています。
C++11では、コンパイラに何らかの情報を示す指標である属性が追加されました。ただし、属性は標準定義か実装定義のいずれかであり、カスタム属性を作成することはできません。[ 2 ]
class Integer { private : [[ no_unique_address ]] int x ; public : [[ nodiscard ]] bool isPositive () const noexcept { if ( x > 0 ) [[ likely ]] { return true ; } return false ; } };C++26では、リフレクションを使用して作成およびアクセスできるアノテーションが追加され、任意のメタデータを付加できるようになりました。[ 3 ]
import std ;std :: stringを使用します。// namespace wikipedia::examples で定義されているいくつかの注釈using wikipedia :: examples :: Debug ; using wikipedia :: examples :: EnumFlag ; using wikipedia :: examples :: Rename ;enum class [[ = EnumFlag ]] Toggle : uint8_t { Off , On };struct [[ = Debug ]] Person { [[ = Rename ( "full name" )]] string fullName ; int age ; };C# プログラミング言語では、属性はアセンブリ、メンバー、型など、フィールドまたはコードブロックに付加されるメタデータであり、Java の注釈に相当します。[ 4 ]属性は、コンパイラとリフレクションによるプログラムの両方からアクセスできます。一方、C# の用語では、プロパティはクラスのメンバーであり、構文的にはインスタンス (またはクラス) 変数のように使用されますが、ゲッター/セッター関数のペアとして実装されます。(セッターがない場合、プロパティは読み取り専用です。)
この言語のユーザーは、属性が横断的な懸念事項やその他のメカニズム的またはプラットフォーム的な用途に対処するために使用されている例を数多く目にします。そのため、属性の本来の用途はそれだけであるという誤った印象が生まれます。
メタデータとしての具体的な使用方法は開発者に委ねられており、インスタンス固有ではない、あらゆるアプリケーション、クラス、メンバーに関する幅広い種類の情報を網羅できます。特定の属性をプロパティとして公開するかどうか、またそれらをより大きなアプリケーションフレームワークの一部として使用するかどうかも、開発者の判断に委ねられています。
属性は、から派生したクラスとして実装されます。これらは、 COM相互運用性、リモート処理、シリアル化などのCLRサービスでよく使用され、実行時に照会できます。System.Attribute
この例は、C# で属性がどのように定義されるかを示しています。
// コンパイラーメッセージに「 [Obsolete("代わりにクラス NewClass を使用してください", IsError = true)] public class ObsoleteClass { // ... }」と表示されるpublic class NewClass { // ... }// クラス名は「Attribute」で終わりますが、 // 「Obsolete」としても使用できます。public class ObsoleteAttribute : Attribute { public string Message { get ; } public bool IsError { get ; set ; } public ObsoleteAttribute () {...} public ObsoleteAttribute ( string msg ) {...} public ObsoleteAttribute ( string msg , bool error ) {...} }[廃止] [廃止("これは廃止されました")] [廃止("これは廃止されました", false)] [廃止("これは廃止されました", IsError = false)]上記の文字列型の最初のパラメータのような位置パラメータは、属性のコンストラクタのパラメータです。例のブール型パラメータのような名前パラメータは属性のプロパティであり、定数値である必要があります。[ 5 ]
属性は、メタデータを定義するものの、コンパイルされたアセンブリには含まれないためプログラムからアクセスできないXMLドキュメントと比較されるべきである。
チェックボックスのchecked属性とプロパティが変更されたときに、それらを表示します。
< ! doctype html > <html> <body>< input id = " check1 " type = " checkbox" checked = " checked " > < label for = "check1" >チェックを入れる</label> <p> </p><script> document.getElementById ( 'check1' ) . addEventListener ( ' change' , function ( e ) { var input = this ; var p = document.querySelector ( ' p' ) ; p.innerHTML = " input.checked : <b> " + ( input.checked ? ' true ' : ' false ' ) + " </b> " } ) ; </script> </body> </html>Java言語は、シンボルに関するメタデータを保持したり、コード生成を実行したりするためにアノテーションを使用し、リフレクションを使用してアクセスできます。[ 6 ]
abstract class Animal { public abstract void speak ();public String getType () { return "一般的な動物" ; } }class Cat extends Animal { @Override public void speak () { System . out . println ( "ニャー!" ); }@Override public String getType () { return "Cat" ; } }多くのポストリレーショナルデータベースシステムや多値データベースシステムでは、SQLと比較して、テーブルはファイル、行は項目、列は属性に相当します。データベースとコードの両方において、属性はプロパティや変数と同義ですが、属性はさらに定義して値やサブ値を含めることもできます。
これらのデータベースの最初のものは、Pickオペレーティングシステムでした。現在のプラットフォームとしては、Rocket U2のUniverseとInterSystemsのCachéが挙げられます。
Pythonでは、属性はデコレータと呼ばれ、ソース コードを変更せずに別の関数、変数、またはクラスを拡張または変更できる呼び出し可能なものです。[ 7 ]デコレータは で表され@、宣言の上に表示されます。
from functools import wraps from typing import Any , Callable , TypeVarT = TypeVar ( "T" )def log_call ( func : Callable [ ... , T ]) -> Callable [ ... , T ]: @wraps ( func ) def wrapper ( * args : tuple [ int , ... ], ** kwargs : dict [ str , str ]) -> T : print ( f "Calling { func . __name__ } with args= { args } , kwargs= { kwargs } " ) return : T = func ( * args , ** kwargs ) print ( f " { func . __name__ } returned { result } " ) return result return wrapper@log_call def add ( a : int , b : int ) -> int : return a + b@log_call def greet ( name : str ) -> str : return f "こんにちは、{ name }さん!"Rustでは、属性の構文は であり#[attr]、任意のシンボル、あるいはステートメントにも配置できます。属性は、シンボルにメタデータを付加することで、コードのコンパイル方法や動作を変更します。Rust では、属性は手続き型マクロの一種であり、コードを消費および生成することでRust 構文に作用します。 [ 8 ]
言語には多くのマクロが定義されていますが、手続き型マクロを使用して新しいマクロが作成されます。既存のマクロの使用例を以下に示します。[ 9 ]
// 関数をインラインとしてマークします#[inline] fn add ( a : i32 , b : i32 ) -> i32 { a + b }// 未使用変数を許可する#[allow(unused_variables)] fn example () { let x = 5 ; }// プラットフォームが Windows の場合のみ関数を条件付きコンパイルします#[cfg(target_os = "windows" )] fn windows_only () { println! ( "Windows で実行中です。" ); }#[derive(Ts...)]Rust は、特性を自動的に実装するために使用される「derive マクロ」と呼ばれるものもサポートしています。
// Point は Debug、Clone、PartialEq 特性を自動的に実装します#[derive(Debug, Clone, PartialEq)] struct Point { x : i32 , y : i32 , }Swiftでは、属性は文字で表され@、コンパイラに追加のメタデータを示します。属性は、宣言属性、型属性、プロパティラッパー、並行性属性、インターフェースビルダー属性に分類できます。[ 10 ]
@available ( iOS 17 , * ) func newFeature () { print ( " iOS 17以降でのみ利用可能です" ) }XMLにおいて、属性とは、開始タグまたは空要素タグ内に存在する名前と値のペアからなるマークアップ構造です。HTMLやXMLなどのマークアップ言語は、属性を使用してデータとその書式を記述します。
良い例として、XML でプロパティ (要素) に値を割り当てるプロセスが挙げられます。要素の値は、要素自体ではなく、(別の) 終了タグの前に記述されることに注意してください。要素自体には、複数の属性が設定されている場合があります ( NAME = "IAMAPROPERTY")。
CUSTOMER_NAME問題の要素が別のエンティティ(たとえば)のプロパティ()とみなせる場合CUSTOMER、その要素はゼロ個以上の独自の属性(プロパティ)を持つことができます(CUSTOMER_NAMEはのですTYPE = "KINDOFTEXT")。
{{cite web}}: CS1 maint: 複数の名前: 著者リスト (リンク)