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

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

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

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

Q&A

解決済

1回答

157閲覧

PYTHON デコレーターの使い方

koikogarey

総合スコア52

Python

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

0グッド

0クリップ

投稿2019/03/18 11:43

python初心者です。

わからないこと・質問


def adult(func): 関数内で書かれている print (func(person)) の意味がわかりません。
func関数?は定義していないのではないでしょうか?


def drink(person):
return person.name + 'は、お酒を飲めます。'
上記には条件式がないのに、なぜ "は、未成年なのでだめです。という文言はdaigorouには出力されないのでしょうか?

デコレーターの意味がわかりません。以下はデコレータを使いpersonの年齢が20未満のときは、「未成年はだめ。」
20歳以上の時は お酒を飲めますと出力するプログラムです。ソース自体にバグはないと思います。

ターゲットとなるソース

class Person(): def __init__(self,name,age): self.name = name self.age = age daigorou = Person('daigorou',22) mana = Person('mana', 14) def adult(func): def checker(person): if person.age < 20: print(person.name + "は、未成年なのでだめです。") else: print (func(person)) return checker @adult def drink(person): return person.name + 'は、お酒を飲めます。' @adult def smoke(person): return person.name + 'は、タバコを吸えます。'

出力結果

drink(daigorou) # daigorouは、お酒を飲めます。 smoke(daigorou) # daigorouは、タバコを吸えます。 drink(mana) # manaは、未成年なのでだめです。 smoke(mana) # manaは、未成年なのでだめです。

初歩的な質問となり申し訳ありませんが宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

def adult(func): 関数内で書かれている print (func(person)) の意味がわかりません。
func関数?は定義していないのではないでしょうか?

関数adultの仮引数funcを使っています。
Pythonにおいては、関数も他のオブジェクトと同様に取り扱うことが可能なのです。

Python

1>>> print(42) 242 3>>> 4>>> my_func = print 5>>> my_func(42) 642

def drink(person):
return person.name + 'は、お酒を飲めます。'
上記には条件式がないのに、なぜ "は、未成年なのでだめです。という文言はdaigorouには出力されないのでしょうか?

実際には先にcheckerが呼ばれているからです。

デコレーターの意味がわかりません。

デコレータを使わないで書くこともできます。

Python

1def drink(引数): 2 ... 3 4drink = adult(drink)

これでも同じ。
参考:Pythonドキュメント » 用語集 - decorator


次のサンプルを分析してみると良いでしょう。

Python

1class Person(): 2 def __init__(self,name,age): 3 self.name = name 4 self.age = age 5 6 7daigorou = Person('daigorou',22) 8mana = Person('mana', 14) 9 10 11# 12def adult(func): 13 print(f'adultが呼ばれました。引数func: {func}') 14 print('checkerを作成します。') 15 16 def checker(person): 17 print(f'checkerが呼ばれました。引数person: {person}') 18 19 if person.age < 20: 20 print(person.name + "は、未成年なのでだめです。") 21 else: 22 print (func(person)) 23 24 print('checkerを返します。') 25 return checker 26 27 28# 29print('-'*20) 30print('drinkを作成します。') 31 32@adult 33def drink(person): 34 print('drinkが呼ばれました。') 35 return person.name + 'は、お酒を飲めます。' 36 37# 38print('-'*20) 39print('smokeを作成します。') 40 41@adult 42def smoke(person): 43 print('smokeが呼ばれました。') 44 return person.name + 'は、タバコを吸えます。' 45 46# 47print('-'*20) 48print('drinkを呼びます。') 49drink(daigorou) 50 51# 52print('-'*20) 53print('smokeを呼びます。') 54smoke(mana)

実行結果 Wandbox

plain

1-------------------- 2drinkを作成します。 3adultが呼ばれました。引数func: <function drink at 0x7f86ef108840> 4checkerを作成します。 5checkerを返します。 6-------------------- 7smokeを作成します。 8adultが呼ばれました。引数func: <function smoke at 0x7f86ef108950> 9checkerを作成します。 10checkerを返します。 11-------------------- 12drinkを呼びます。 13checkerが呼ばれました。引数person: <__main__.Person object at 0x7f86ef0aa278> 14drinkが呼ばれました。 15daigorouは、お酒を飲めます。 16-------------------- 17smokeを呼びます。 18checkerが呼ばれました。引数person: <__main__.Person object at 0x7f86ef0aa2b0> 19manaは、未成年なのでだめです。

投稿2019/03/18 12:48

編集2019/03/18 12:53
LouiS0616

総合スコア35660

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

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

koikogarey

2019/03/18 12:59

丁寧にご説明頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問