Python学習ノート(三)

12398 ワード

サードパーティモジュールのインストール
python 2.7.9バージョンにはpipが内蔵されており、公式に推奨されています.コマンドラインで-pip install xxxを使用します.pyサードパーティモジュールのインストール-コマンドラインpythonを入力し、pythonのコマンドラインモードに入ります-import xxx
futureの使用
Pythonの新しいバージョンでは新しい機能が導入されますが、実際にはこれらの機能は前の古いバージョンですでに存在しています.新しいプロパティを「試用」するには、futureモジュールのいくつかの機能をインポートすることで実現できます.
futureの前後の下線は2つです
Python 3.xでは、文字列はunicodeに統一され、接頭辞uを付ける必要はなく、バイトで格納されたstrは接頭辞bを付ける必要がある.futureを利用したunicode_literalsはPython 2.7にunicode文字列を記述する.
from __future__ import unicode_literals

s = 'am I an unicode?'
print isinstance(s, unicode)

オブジェクト向け
オブジェクトclass Person(object):ここのobjectは他の親に変更できます
インスタンス化オブジェクトp 1=Person():new不要
インスタンス化属性p 1.name=「明ちゃん」:javaのようなオブジェクトクラスごとに属性を作成しないで、オブジェクトの属性を直接追加できます.pythonは動的言語だからです.
Javaのような構造方法を使うなら、次の点を見てください.
初期化インスタンス属性Personクラスが作成されたときにname、gender、birth属性を持つ必要がある場合、Personクラスを定義するときに、Personクラスにinit()メソッドを追加できます.インスタンスを作成すると、init()メソッドが自動的に呼び出され、各インスタンスに以下の属性を統一することができます.
class Person(object):
    def __init__(self, name, gender, birth):
        self.name = name
        self.gender = gender
        self.birth = birth

注意:ここでselfパラメータは追加する必要がありますが、外部に露出するパラメータは後ろの3つしかありません.つまり、呼び出し時に後ろの3つのパラメータを記入するだけです.
p1 = Person('name', 'man', '2012')

そしていったん使ったらinit__メソッドは、呼び出すときにパラメータを備えなければなりません.
アクセス制限
Pythonの属性権限の制御は、属性名によって実現され、1つの属性が二重下線で始まる場合()、このプロパティは外部からアクセスできません.
単一下線->保護を表します->外部からインポートできません.from xx import xxx二重下線->プライベートを表します->サブクラスが前後の二重下線を継承できません->Pythonで特殊な機能を表す関数は、一般的に自分で定義しないでください.入_init__(self,options)メソッドは、例えば_init__方法は、前の二重下線を外すとp 1.initは使えます
関数をメソッドに変更
Pythonではメソッドも属性であるため、typesを使用するだけでインスタンスに動的に追加することもできます.MethodType()は関数をメソッドに変更します.
import types
def fn_get_grade(self):
    if self.score >= 80:
        return 'A'
    if self.score >= 60:
        return 'B'
    return 'C'

class Person(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score

p1 = Person('Bob', 90)
p1.get_grade = types.MethodType(fn_get_grade, p1, Person)
print p1.get_grade()
# => A
p2 = Person('Alice', 65)
print p2.get_grade()
# ERROR: AttributeError: 'Person' object has no attribute 'get_grade'
#   p2       get_grade

クラスメソッドの定義
classで定義されているのはすべてインスタンスメソッドであり、インスタンスメソッドの最初のパラメータselfはインスタンス自体である.
クラスメソッドをclassで定義するには、次のように書く必要があります.
class Person(object):
    count = 0

    @classmethod
    def how_many(cls):
        #               ,          cls
        return cls.count

    def __init__(self, name):
        self.name = name
        Person.count = Person.count + 1

print Person.how_many()
p1 = Person('Bob')
print Person.how_many()

上のcls.カウントは実はPersonに相当する.count
継承と所有
Pythonの各クラスは継承され、適切な親がいなければobject hasで所有を示す必要があります.studentとbookは持つ関係です
継承が完了すると、_init__()メソッドではSonClass._を使用してください.init__(親初期化関数のパラメータ)親の関連属性とメソッドを初期化し、SonClassは子のクラス名を示します.
class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender

class Student(Person):
    def __init__(self, name, gender, score):
        SonClass.__init__(name, gender)
        self.score = score

判定タイプisinstance
あるクラスが別の親であるかどうかを判断するために使用されます(継承が完了したら、このクラスを本クラスと呼ぶことも親と呼ぶこともできます).例えば、StudentはPersonから継承され、継承が完了した後にStudentはPersonタイプと呼ぶこともできるし、Studentと呼ぶこともできる.isinstance(s,Person)の戻り値をtrueとする
マルチステート
基本的にjavaと同様に、異なるサブクラスオブジェクトによって異なる結果が表示されます.
追加:Pythonは動的言語なので、同じ名前の方法があれば、どのタイプのインスタンスでも構いません.
#Python   open()           ,    File   。File
#     read()          :
#  ,           JSON  :
import json
f = open('/path/to/file.json', 'r')
print json.load(f)

#  Python     ,json.load()        File     
# 。    ,   read()  ,   File-like Object,     #json.load()。

import json

class Students(object):
    def read(self):
        return r'["Tim", "Bob", "Alice"]'

s = Students()
print json.load(s)

#[u'Tim', u'Bob', u'Alice']

多重継承
詳細は次のブログをご覧ください:Python学習ノート(四)多重継承と内部アルゴリズム解析
カスタムクラスと特殊なメソッド
__str__()クラスのインスタンスをstrにするには、JavaのtoString()メソッドと同様に、書き換えて、自分の望む結果を返す必要があります.print listはprint listです.str__()
__repr__()Python定義しました_str__()と_repr__()2つの方法、_str__()ユーザに表示するために使用され、_repr__()開発者に表示するために使用します.
#        __repr__   :
class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender
    def __str__(self):
        return '(Person: %s, %s)' % (self.name, self.gender)
    __repr__ = __str__

__cmp__()int、strなどの組み込みデータ型をソートする場合、Pythonのsorted()はデフォルトの比較関数cmpでソートされますが、Studentクラスのインスタンスのセットをソートする場合は、独自の特殊な方法を提供する必要があります.cmp_()
__len__()クラスがlistのように表現されている場合、要素を取得するにはlen()関数を使用します.
len()関数を正常に動作させるには、クラスは要素の数を返す特殊な方法len()を提供する必要があります.
__slots__()追加する属性を制限する場合、たとえばStudentクラスがname、gender、scoreの3つの属性のみを追加できるようにすれば、Pythonの特殊なslotsを利用して実現することができます.その名の通り、_slots__は、列挙と同様にクラスが許可する属性リストを指します.追加されたプロパティはslotsにリストされている値のみで、多くなるとエラーが表示されます.
class Student(object):
    __slots__ = ('name', 'gender', 'score')
    def __init__(self, name, gender, score):
        self.name = name
        self.gender = gender
        self.score = score

>>> s = Student('Bob', 'male', 59)
>>> s.name = 'Tim' # OK
>>> s.score = 99 # OK
>>> s.grade = 'A' # Error
Traceback (most recent call last):
  ...
AttributeError: 'Student' object has no attribute 'grade'

__call__()Pythonでは、関数は実際にはオブジェクトです.
>>> f = abs
>>> f.__name__
'abs'
>>> f(-123)
123

fは呼び出すことができるので、fは呼び出すことができるオブジェクトと呼ばれる.
すべての関数は呼び出し可能なオブジェクトです.
クラスインスタンスを呼び出し可能なオブジェクトにすることもできます.特別な方法を実装するだけです.call__().
Personクラスを呼び出し可能なオブジェクトにします.
class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender

    def __call__(self, friend):
        print 'My name is %s...' % self.name
        print 'My friend is %s...' % friend

>>> p = Person('Bob', 'male')
>>> p('Tim')
My name is Bob...
My friend is Tim...

p(‘Tim’)を見ると、pが関数なのかクラスインスタンスなのか分からないので、Pythonでは関数もオブジェクトであり、オブジェクトと関数の違いは顕著ではありません.