ぴあぴあゆーとぴあ

雑記ブログ

Pythonの開発環境などについて色々

最近卒研でPythonを触っています。
備忘録代わりに色々まとめようかなと思います。

開発環境

基本的にatomvimプラグインを入れて開発しています。 ただ既存のatompythonコードのハイライトが、アノテーションに対応していなかったので、MagicPythonのプラグインを入れて居ます。
これもあんまり好きじゃないのですが、とりあえずこれを使って居ます。
以下の環境を基本的に参考にしました。 おかゆのAtomのパッケージのメモ - ゆくゆくは有へと

Pythonの小ネタまとめ

筆者はもともとC++を触って居たのですが、
pythonコードを書いてて「これはPythonだとどうやるんだろう」と気になったことをまとめようと思います。

抽象クラス関連

親クラスにgetterだけ実装して、子クラスにはsetterみたいなのだけ実装したい場合、 親クラスと子クラス両方で使う変数には「__(アンダーバー2つ)」付けずに実装しなければならないようです。 これでは、子クラス内の変数が隠蔽されません。
これを解消したく色々試した結果、以下のようなコードになりました。

from abc import ABCMeta, abstractmethod

# 抽象クラス
class Animal(metaclass=ABCMeta):
    @classmethod
    @abstractmethod
    def __init__(self):
        self.__voice = ""
        pass

    def get_voice(self) -> str:
        return self.__voice

    @classmethod
    @abstractmethod
    def set_voice(self, voice: str):
        self.__voice = str
        pass

# 抽象クラスを継承
class Dog(Animal):
    def __init__(self):
        self.set_voice("woof")

    def set_voice(self, voice: str):
        #super().voice = voice
        self._Animal__voice = voice


if __name__ == "__main__":
    print(issubclass(Dog().__class__, Animal)) #true
    print(isinstance(Dog(), Animal)) #true
    dog = Dog()
    print(dog.get_voice()) #woof
    #print(dog.voice) # error

set_voice関数で無理やり親クラスの内部変数にアクセスしています。
推奨されない感がすごいですね。。。これ以外の実装方法が思い浮かびませんでした。
良い案求めてます笑
以下のサイトを参考にしました。
PythonのABC - 抽象クラスとダック・タイピング - Qiita
これちょっとQiitaにでも上げて、意見を求めてみようかしら Pythonの親クラスにgetter、子クラスにsetterを実装する。 - Qiita
[加筆]qiitaに書いてみたところ、そもそもアンダーバー2つをそこまで使わなくても良いらしい
たしかにそんな気がする
紳士協定的にアンダーバー付いてるのにアクセスする方が悪いのスタイルで、アンダーバー1つを変数につけるのが正解っぽい。

コーディング規約

結構適当な人間なので、また読み返す
pythonのコード書いてると、スネークケースだらけになるのは私だけでしょうか。
pep8に準拠する - Qiita
Pythonのコーディング規約PEP8を要約してみる(1) - Qiita

可変長引数

*だとタプルになって、**だと辞書オブジェクトに格納されるようです。
qiita.com

XMLファイルの操作

PythonでXML解析 - code snippets

デコレータ関連

デバッグが楽になりそう
自分はgetterじゃなくて@propertyでクラス変数を取得するのがあんまり好きくないので、@propartyはあんまり使ってないです。
リストオブジェクトとかをgetterで返すときはちゃんとdeepcopyしないとバグの温床になりやすいので注意してます
Python デコレータ再入門 ~デコレータは種類別に覚えよう~ - Qiita

matplotlib

基本的に下のサイトを見て、詳しく知りたくなったら、関数名でググります。
最初から公式サイト見た方が速いことも。
matplotlib - Python学習講座
リアルタイムな描画
matplotlibでリアルタイム描画 - Qiita matplotlibによるリアルタイムのグラフ表示 - Qiita

その他参考サイト

Pythonを書き始める前に見るべきTips - Qiita

終わりに

とりあえずこんな感じで。
pep8関連は結構放置しているので手をつけねば、と思ってます。
今度の記事で卒研用に作成した実験用のpythonコードでも説明したいなと思ってます。
githubで公開でもしたいですね。