1
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
2
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:59