質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

213閲覧

Pythonのプロパティについて

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2018/06/07 01:48

Pythonの勉強をしていたところ、以下のようなソースコードを見つけ、よくわからないところがあったので質問します。

Python

1class Player: 2 LEVEL_LIMIT = 10 3 4 @property 5 def level(self): 6 return self.__level 7 8 @level.setter 9 def level(self, value): 10 if value > Player.LEVEL_LIMIT: 11 value = Player.LEVEL_LIMIT 12 self.__level = value 13 14p = Player() 15p.level = 100 16print(p.level)

クラスのデータ属性を定義するさい、____をつけて定義すると、以後外部からは_クラス名____変数名という形でしか参照できないそうですが、今回のreturn self.____levelでは、まだ____levelが定義されていないように思えます。なぜこれでうまいくのでしょうか?回答よろしくお願いします。

chapin👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

少し勘違いしてそうな所を解説。
PythonJavaScriptは後からデータ属性(属性)を付け足せる言語です。
質問文のコードは1,代入(定義) 2,値を取得となっているため問題ないのです。

質問文のコード Wandbox

Python

1p.level = 100 #プロパティに代入 2print(p.level) #取得

逆に以下のコードだとAttributeErrorが発生します。
Wandbox

AttributeError: 'Player' object has no attribute '_Player__level'

Python

1print(p.level)#取得 2p.level = 100 #プロパティに代入

あと私が質問文のコードを書くとしたら以下のようなコードになります。

Python

1class Player(object): 2 LEVEL_LIMIT = 10 3 def __init__(self, level: int=LEVEL_LIMIT): 4 self.__level = level 5 6 @property 7 def level(self): 8 return self.__level 9 10 @level.setter 11 def level(self, value: int): 12 self.__level = min(value, Player.LEVEL_LIMIT) 13 14p = Player() 15p.level = 100 16print(p.level)

投稿2018/06/07 03:01

編集2018/06/07 03:09
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/06/07 03:25

納得できました。変数は上から順に定義されている、と無意識に勘違いしており、setterで__levelが定義されていることに気がつきませんでした。回答していただきありがとうございます。
guest

0

@propertyデコレーターを使うと値の取得だけができるプロパティーがとりあえず定義されます。

Python

1... 2 @property 3 def level(self): # メソッド名がそのままプロパティー名になる 4 # 何かを返すように定義する(どういう計算をしてもかまわない) 5 return ...

これを定義した後で「@プロパティー名.setter」や「@プロパティー名.deleter」というデコレーターが使えるようになりそのプロパティーのセッターやデリーターを定義できます。ご質問のコードではセッターが定義されてますね。これが定義されてるので

p.level = 100

を実行するとセッターメソッドが呼び出されます。その定義ではself.__levelに設定する処理が書いてありますよね?だから上記を実行すると__level属性も設定されているわけです。

@propertyデコレータ関連についてはPythonのリファレンスの以下のところに説明がありますので読んでみてください。

https://docs.python.jp/3/library/functions.html#property

投稿2018/06/07 02:26

KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問