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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

2026閲覧

python3 自作関数の実行について

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/07/02 16:04

編集2018/07/02 17:42

お世話になります、python初心者です。
ご教示願えれば幸いです。

python3

python3.6.6

わからないこと

unittestを利用している中、コードをclass内の別の関数として分割して管理したい。

やったこと

以下のコードを実行しましたところ [my_func() is not defined.]というようなメッセージが出ました。
これが何故なのか教えていただきたいです。
ソースを全文添付したいのですが今は出来ないのでここまでとさせてください。
よろしくお願いいたします。

コード

python

1# -*- coding: utf-8 -*- 2import unittest 3import re 4import logging 5import requests 6import json 7from selenium import webdriver 8class MakeList(unittest.TestCase): 9 10 def setUp(self): 11 self.driver = webdriver.Remote( 12 command_executor='http://localhost:4444/wd/hub', 13 desired_capabilities=DesiredCapabilities.CHROME) 14 15 def my_func(): 16 print("hello world.") 17 18 def test_make_list(self): 19 #.... 20 my_func() 21 22

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

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

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

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

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

mather

2018/07/02 17:16

エラーメッセージとソースコードがあってませんが、my_log は定義されてるんですか?ソースコードは省略せずに全部貼ったほうが適切な回答が得られやすいですよ。
hayataka2049

2018/07/02 18:00

エラーも省略せず掲載した方がこの場合良いと思います(ユーザ名等は伏せても構いません)
guest

回答2

0

ベストアンサー

TLDR

my_funcを呼ぶ側がクラスと関係のない関数として呼び出そうとしているのが原因です。
また、貴方の呼びたい"my_func"の定義の仕方自体も少し間違っています。

クラス内の別の関数ということなのでインスタンスメソッドかクラスメソッドにしてしまいましょう。

python

1class MakeList(unittest.TestCase): 2 3 def setUp(self): 4 self.driver = webdriver.Remote( 5 command_executor='http://localhost:4444/wd/hub', 6 desired_capabilities=DesiredCapabilities.CHROME) 7 8 #こうする 9 def my_func_instance(self): 10 print("hello world : instance method") 11 12 #もしくはこうする 13 @classmethod 14 def my_func_class(cls): 15 print("hello world : class method") 16 17 #そしてこうする 18 def test_make_list(self): 19 #.... 20 self.my_func_instance() 21 MakeList.my_func_class()

出力:

text

1hello world : instance method 2hello world : class method

細かく

test_make_list(self)はmy_funcをクラスの外部にある関数として呼び出そうとしています。

python

1class MakeList(unittest.TestCase): 2 3 def setUp(self): 4 self.driver = webdriver.Remote( 5 command_executor='http://localhost:4444/wd/hub', 6 desired_capabilities=DesiredCapabilities.CHROME) 7 8 def my_func(): # 呼ばれない (無視される) 9 print("hello world : Inside of the class ") 10 11 def test_make_list(self): 12 #.... 13 my_func() # 自インスタンスや自クラスから呼んでいない -> じゃあクラスの外部にあるんだ! 14 15 16def my_func(): # ここにあれば呼べる 17 print("hello world : Outside of the class")

出力:

text

1hello world : Outside of the class

もし"my_func"がインスタンスの情報を触るのであれば、それはインスタンスメソッドとして定義してあげましょう。

以下のようにしましょう:

python

1def my_func(self): # 1. "self"を足す = インスタンスメソッド 2 #self.諸々 にアクセスできる 3 ... 4 5def test_make_list(self): 6 #.... 7 self.my_func() # 2. 自インスタンスを頭につける (強制的に第一引数にインスタンスが入る)

もし"my_func"がクラスの情報だけを触るのであれば、それはクラスメソッドとして定義することもできます。
クラスメソッドは@classmethodデコレータで飾られている必要があります。

以下のようにしましょう:

python

1# 1. デコレータを与える = クラスメソッド 2@classmethod 3def my_func(cls): # 2. 第一引数として自分自身のクラスを取る 4 # cls.諸々 にアクセスできる = MakeList.諸々 と同義 5 # インスタンス変数 (self) にはアクセスできない 6 ... 7 8def test_make_list(self): 9 #.... 10 MakeList.my_func() # 3. クラス名を頭につける (強制的に第一引数にクラスが入る)

投稿2018/07/03 00:46

komugi

総合スコア13

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

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

退会済みユーザー

退会済みユーザー

2018/07/08 04:33

遅くなり失礼しました。 ご教示ありがとうございました。
guest

0

https://docs.python.jp/3/library/unittest.html

python

1def my_func(): 2 ... 3 4def test_make_list(self): 5 #.... 6 my_func()

selfを引数に取らないケースをどこかで見かけたことありますか?
メソッドのコールも同様。クラスの基本的な使い方かと。

python

1def my_func(self): 2 ... 3 4def test_make_list(self): 5 #.... 6 self.my_func()

投稿2018/07/02 22:29

編集2018/07/02 22:31
mkgrei

総合スコア8560

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問