[Python]親クラスで子クラスのメンバを使用する。

コード

 coding=utf-8

from abc import ABCMeta, abstractmethod

class Parent(object):
    
    @abstractmethod
    def hoge(self):
        print(self.name)

    @abstractmethod
    def fuga(self):
        print(self.age)

    @abstractmethod
    def fuga2(self, age):
        print(age)

class Child(Parent):

    def __init__(self):
        self.name='nekonisi'
        self.__age='26'

    def hoge(self):
        super().hoge()

    def fuga(self):
        super().fuga() #error

    def fuga2(self):
        super().fuga2(self.__age)

if __name__ == '__main__':
    child = Child()
    child.hoge()
    # child.fuga() #error
    child.fuga2()

実行結果

nekonisi

26

解説

  • 親クラスParentで,hoge, fugaメソッドを宣言して子クラスChildで使用する。
  • その際に,子クラスのメンバを使用したいが,プライベートメンバだと,親クラスで参照できないためエラーになってしまう。
  • 回避策として,fuga2では子クラスのプライベートメンバを引数として渡してあげて実行している。

問題

  • 複数のプライベートメンバを使用するときに,引数が増えてしまう。
  • 自インスタンスを引数として渡してあげる方法もダメだった。

解決策

  • 会社の先輩に聞いたら,「できるわけねーだろ」とのこと
  • そもそも設計思想がおかしい。
    • 子クラスのメンバを使用したメソッドが親クラスにあること自体がおかしい。
  • 下記のように修正
# coding=utf-8

from abc import ABCMeta, abstractmethod

class Parent(object):

    def __init__(self, name: str, age: int):
        self.__name = name
        self.__age = age
    
    @abstractmethod
    def hoge(self):
        print(self.__name)

    @abstractmethod
    def fuga(self):
        print(self.__age)

class Child(Parent):

    def __init__(self):
        super().__init__('nekonisi', 26)

    def hoge(self):
        super().hoge()

    def fuga(self):
        super().fuga()

if __name__ == '__main__':
    child = Child()
    child.hoge()
    child.fuga()

 

そうすると,コンストラクタのオーバロードとかもしたくなっちゃう。

追記

オーバーロードは下記のように実現する。

# coding=UTF-8

class hoge(object):
    def __init__(self, name=None, age=None):
        if name is None:
            name = 'noname'

        if age is None:
            age = 0

        self.__name=name
        self.__age=age

    def introduce(self):
        print('My name is ' + self.__name)
        print('I\'m ' + str(self.__age) + ' years old.')

if __name__ == '__main__':
    obj1 = hoge()
    obj2 = hoge('nekonisi', 26)
    obj3 = hoge('konisi')

    obj1.introduce()
    obj2.introduce()
    obj3.introduce()

実行結果

My name is noname
I'm 0 years old.
My name is nekonisi
I'm 26 years old.
My name is konisi
I'm 0 years old.

 

以上

[PyCharm]venv環境の設定手順

What’s venv?

venv は virtualenv が Python 3.3 から標準機能として取り込まれたものである.別途ソフトウェアをインストールすることなく使用できる.pip によるパッケージの導入状態をプロジェクトごとに独立させることができる.

https://qiita.com/fiftystorm36/items/b2fd47cf32c7694adc2e

PyCharmによるインタプリタの設定

Ctrl + Alt + s > プロジェクト > プロジェクト・インタープリター > 各項目を設定する。

タブレットで実行するとうまくいかなかったので新規の仮想環境を構築した。

補足

環境変数PYTHONPATHPATHにpythonのパスを指定していると,挙動がおかしくなった。

現環境では,PATHのみに指定することにした。

以上

 

pycharmのインストールから日本語化(for Windows)

What’s PyCharm?

PyCharmPython統合開発環境 (IDE) の一つである。

wikipedia~PyCham~

PyCharmのインストール

公式サイトより,最新版のexeをダウンロード

  1. ダウンロードしたexeファイルを実行
  2. Next連打(雑)

Pleiadesによる日本語化

What’s Pleiades?

Pleiades は Eclipse や Android Studio のような Java アプリケーションを日本語化するためのツールです。~ 公式サイトから抜粋 ~

(Eclipseだけじゃないんだ…。)

  1. 公式サイトから,Pleadesプラグインをダウンロード
  2. zip解凍
  3. 解凍したフォルダから, setup.exe(ショートカット)を実行
  4. 日本語化するアプリケーションにpycharm.exeを指定
    例(C:\Program Files\JetBrains\PyCharm Community Edition 2018.2.3\bin\pycharm.exe)
  5. 日本語化をクリック

以上

Djangoでtemplatesと変数を表示する

template

Djangoでは、templateを使用して表示を行う。

MTVだか、なんだか。

templateの設定

  1. settings.pyに、
            'DIRS': [
                os.path.join(BASE_DIR, 'templates'),
            ],

    を追加してやる。

TODO
以下の関数や特殊なグローバス変数について調べる。
os.path.dirname()
os.path.abspath()
__file__

2. myapp内に、templatesフォルダを作成し、index.htmlを作成する。

3. hello/view.pyにrender関数を追加し、urls.pyにもディスパッチャを記述する。

詳しくは今日書く

以上

Djangoでhello! worldを出すためにハマったこと

includeメソッドの引数について

最新のDjangoだと django.conf.urls.include() は namespace='hoge' が使えません。

使えないんかい! namespaceを使用したい場合は、app_name='hoge'を宣言してあげる。

今回は、namaspaceを使用しなくても動作した。

参考

https://teratail.com/questions/88819

HttpResponceなんてねーぜ

import漏れ、

from django.http.response import HttpResponse
使用するときは、importしてあげる。

ソースをコピペる時は、include文とかimport文をよく見よう。

ポートを指定したurlの書き方

これは、恥ずかしい。

ポートを指定してアクセスする

総括

  • FWとか言語のバージョンによって書き方違うので注意する。
  • import, includeについても注意する。
  • ネスペの勉強頑張れ

とりあえず、Hello! Worldを出せたのでCRUDまで頑張る。

参考にしたページ

https://eiry.bitbucket.io/tutorials/tutorial/views_and_urls.html

以上

django開発環境構築メモ

接続DBの定義

$vim myapp/myapp/setting.py

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'djangodb',
'USER': 'root',
'PASSWORD': 'hogehoge',
'HOST': '',
'PORT': ''
}
}

同ファイルの上部に下記を追加

import pymysql
pymysql.install_as_MySQLdb()

マイグレーションの実行

マイグレーションとは、システム、または、データ資産の移行作業のことである。

python manage.py migrate

うまくいかなかった。

以上

mysqlでデータベースの作成

デーモンの起動

$sudo systemctl start mysqld

rootで実行

$sudo mysql

データベースの作成

mysql> CREATE DATABASE djangodb

実行結果

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

mysql> create database djangodb;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| djangodb |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)

以上