クラス変数とインスタンス変数

間違いやすいPythonのクラス変数とインスタンス変数 - 北海道苫小牧市出身の初老PGが書くブログ
確かに間違えやすい。というか混乱してきたw

クラス間で共有しない変数ならself.hogeみたいな代入がいいってことなのかな。でもinitでself.hogeしてるならインスタンスになると思うのだが。

>>> class Test:
        # クラス変数
...     hoge = 100
...     def __init__(self):
            # インスタンス変数
...         self.hoge = 200
...         
...     
... 
>>> Test()
<__main__.Test instance at 0x976306c>
>>> a = Test()
>>> a.hoge
200
>>> Test.hoge
100
>>> a.__dict__
{'hoge': 200}
>>> Test.__dict__
{'__module__': '__main__', '__doc__': None, '__init__': <function __init__ at 0x
978795c>, 'hoge': 100}

SyntaxError: Non-ASCII character

SyntaxError: Non-ASCII characterとエラーがでる

日本語が入ってるとそうなるらしい。

# coding=utf-8
# ここにcoding=utf-8を入れるとなおった。
# ただ、utf-8で保存しても駄目みたい。

class SomeName(object):
    """ データとコードは通常ここで定義 """

anInstance = SomeName()
another = SomeName()

print(another.__doc__)

多重継承された場合のsuper

super(type[,object-or-type])で継承されたクラスが取得できるみたいだけど、多重継承されたクラスに同じメソッドがある場合どうなるのかなーと思って試してみた。

class SomeName(object):
    """ データとコードは通常ここで定義 """
    sample = 100
    
    def repeat(self, N):
        for i in range(N):
            print(i)

class Behave(object):
    def __init__(self, name):
        self.name = name
        
    def once(self):
        print "Hello,", self.name
    
    def rename(self, newName):
        self.name = newName
        
    def repeat(self, N):
        for i in range(N):
            self.once()

# どうも継承順序で優先されるメソッドが決定されるみたい
# SomeName.repeatが優先される
class OneMore2(SomeName,Behave):
    def repeat(self, N):
        super(OneMore2, self).repeat(N + 1)

# Behave.repeatが優先される
class OneMore3(Behave,SomeName):
    def repeat(self, N):
        super(OneMore3, self).repeat(N + 1)

and と or の動作がイメージと違う

  • andの場合
    • 値は左から右にブール値として評価されます。
    • すべての値がブール値としてtrueである場合、 and は最後の値を返します。
    • いづれかの値がfalseである場合、 and は最初のfalseとなる値を返します。
>>> 1 and 2 and 3 and 4
4
>>> [] and {} and 0 and 1 and 2
[]
  • orの場合
    • 値は左から右にブール値として評価されます。
    • いづれかの値がtrueである場合、 or はすぐにその値を返します。
    • すべての値がfalseの場合、 or は最後の値を返します。
    • or はブール値としてtrueである値が見つかるまで値を評価します。残りは無視します。
>>> 1 or 2 or 3 or 4
1
>>> 0 or {} or [] or () or 1
1

プライベート関数

5.9. プライベート関数
多くの言語のように Python はプライベート要素の概念があります。

プライベート関数は、そのモジュールの外からコールすることができません。
プライベートメソッドは、そのクラスのの外からコールすることができません
プライベート属性は、そのクラスの外からアクセスすることができません
多くの言語とは違って、 Python の関数、メソッド、属性がプライベートかパブリックのどちらであるかは、名前によって完全に分けられます。
  • 関数、クラスメソッド、属性の名前は、2つのアンダースコアで始まる(ただし、2つのアンダースコアでは終わらない)場合、プライベートになります。そのほかはすべてパブリックです。
  • Python は protected (自分自身のクラスとその子クラスだけがアクセスできる)の概念がありません。
  • クラスメソッドはプライベート(自分自身のクラスだけがアクセスできる)かパブリック(どこからでもアクセスできる)のどちらかです。