『Python高級プログラミング』読書ノート


1.
装飾器は簡単に言えば装飾関数の関数で、修飾された新しい関数を返します。
三つの素晴らしい文章:
http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html
http://blog.csdn.net/thy38/archive/2009/08/21/4471421.aspx
http://www.codecho.com/understanding-python-decorators/
2.
Listのような tuple プロジェクト このような内装タイプのサブクラス化は、機能が似ているクラスが必要な場合には、サブクラス化したほうがいいです。
3.
古いMROは検索方法が属するクラスの場合、継承した基質から「左から右への深さ優先」に従い、新しいMRO(2.3バージョン後)はC 3の線形化方法を採用しています。
class basebase():
	def method(self):
		print "basebase"

class base1(basebase):
	pass

class base2(basebase):
	def method(self):
		print "base2"
		
class myclass(base1, base2):
	pass

here = myclass()
here.method()
結果はbasebaseです
class basebase(object):
	def method(self):
		print "basebase"

class base1(basebase):
	pass

class base2(basebase):
	def method(self):
		print "base2"
		
class myclass(base1, base2):
	pass

here = myclass()
here.method()
結果はbase 2です
クラス検索の順序は
myclass base 1 base 2 basebase object
4.
基質は、__init___では暗黙的に呼び出されません。
5.
mroは、1つのクラスのすべての基本クラスの種類のシーケンスを記録している。
クラスの_mro__特性は、線形化計算の結果を格納しており、クラス継承時の検索手順として簡単に理解できる。
6.
superは関数ではなく、クラス名であり、super(B,self)のような形をしています。実際にsuper類の初期化関数を呼び出してsuperオブジェクトを生成しました。super類の初期化関数は特別な操作をしていません。種類と具体的な実例を簡単に記録しました。 super(B,self).funcの呼び出しは、現在のクラスの親タイプのfunc関数を呼び出すためのものではない。 Pythonの複数の継承クラスは、mroによって個々の親クラスの関数が呼び出されることを保証し、各親関数が一回だけ呼び出されることを保証します。super類と非結合関数を混用することは危険行為です。これは呼び出されるべき親関数が呼び出されていないか、または親関数が何回も呼び出されていないことを招きます。
非バインディングとは、
A.__init__(self)
要約:http://blog.csdn.net/johnsonguo/article/details/585193
superの役割は、現在のクラスの親を探して、リストに入れて、このリストの順に関数を呼び出します。このリストにmroがあります。
使う時は一貫性を保つべきです。全部使ってもいいです。全部使わないでください。
7.
一般に「_」プレフィクスは、「_u u」を用いずにクラスにおいて非公開な特性を表す。
8.
Pythonでは、1つの属性にアクセスする優先順位は以下の順序である。
   1:クラスの属性
   2:データ記述子
   3:インスタンスのプロパティ
   4:非データ記述子   5:_ゲッタード()方法
9.
ディスクリプタ(descriptor)は、データディスクリプタと非データディスクリプタに分けられます。データディスクリプタは、ガジェット、ガジェット、ガジェット、ガジェット、ガジェットの3つの方法のクラスを実現しました。
setは属性の割り当て時に変更されます。
getはこの属性が戻った時に行う操作です。
deleteは回収時の操作です。
class simpleDescriptor(object):  
	def __init__(self):  
		self.result=None;  
	def __get__(self,obj,type=None) :  
		return self.result-10;  
	def __set__(self,obj,val):  
		self.result=val+3;  
		print self.result;  
	def __del__(self,obj):  
		pass   
	  
class A(object):  
	foo=simpleDescriptor();  
a=A();  
a.foo=13;  
print a.foo;
出力:
16
6
セットが実現されていません delは非データ記述子です。すべての関数は非データ記述子です。
参考:http://onlypython.group.iteye.com/group/wiki/1362-python-39-s-descriptor
10.
_slaotsの溝 指定されたクラスに静的なリストを設定することにより、各クラスのインスタンスの_dict_u uの作成をスキップすることで、空間を節約します。派生クラスでは動作できません。
class Frozen(object):
	ice = 1
	cream = 1
	pass

print '__dict__' in dir(Frozen)

print 'ice' in dir(Frozen)

ga = Frozen()
ga.ice = 2
ga.cream = 2
ga.icy = 3

print ga.ice, ga.cream, ga.icy
出力
True True 2 2 3
class Frozen(object):
	__slots__ = ['ice','cream']

print '__dict__' in dir(Frozen)

print 'ice' in dir(Frozen)

ga = Frozen()
ga.ice = 2
ga.cream = 2
ga.icy = 3

print ga.ice, ga.cream, ga.icy
出力は
False True Traceback(most recent call last):  File"/home/zawdd/workspace/MyPython/project 1/chapter 3.py,line 55,in    ga.icy=3 AttributeErr:'Frozen'oject hasのatribute'icy'
11
dir()はクラスの有効な属性をすべて表示します。
12
u_dict___属性がないので、list、stringなどのカスタム属性を付加することはできません。
13の関数も対象で、関数は関数で、方法は方法で、方法はinstancementhodに分けられます。 ,classimethod、staticmethod
class T(object):
	def hello1(self):
		print "hello1"
		
	def hello2():
		print "hello2"
		
	hello2 = staticmethod(hello2)
	
	def hello3(cls):
		print "hello3", cls
	
	hello3 = classmethod(hello3)

t = T()
t.hello1()
t.hello2()
t.hello3() #AttributeError: 'T' object has no attribute 'hello3'
print t.hello1 #<bound method T.hello1 of <__main__.T object at 0xb71f38cc>>
print t.hello2 #<function hello2 at 0xb7289144>
print t.hello3 #<bound method type.hello3 of <class '__main__.T'>>
#T.hello1()#unbound method hello1() must be called with T instance as first argument (got nothing instead)
print " "
T.hello2()
T.hello3()
print T.hello1 #<unbound method T.hello1>
print T.hello2 #<function hello2 at 0xb734e144>
print T.hello3 #<bound method type.hello3 of <class '__main__.T'>>
staticmethodは、方法を関数にして、最初のselfパラメータを必要としないようにする。
14
type()は名前、ベース、属性をパラメータとして受け入れ、クラスを返します。
_metaclass_はクラスの新しい特性を修正または増加するために使用します。
metaclassの実装結果はクラスで、classが実装された結果はinstance(_new_作成類を呼び出すことにより)です。
参考:http://jianpx.iteye.com/blog/908121
15 PEPに従う 8命名の約束
名前を付ける時は、プリアンブルでプライベートを表します。方法と関数は小文字で下線をつけます。
二重下線表は特殊です。
クラスの名前は大文字で始まります。
モジュール名は下線のない小文字を使用しており、私用の場合は下線を引く。
名前の重複を防ぐために、下線のクラスを後ろに付けることができます。 よくklassを書きます またはcls
16.
既に公開されているAPIについては、修正時にdeprecationプロセスに従い、1、2のバージョンの間に、1.5バージョンを追加し、このバージョンで修正のヒントを与える。
warningモジュールを使ってこの目的を達成します。
17.
Pythonが汚染されることを避けるために、アプリケーションレベルの動作環境は、アプリケーションに使用されるすべての依存モデルを分離することができるはずである。
既存のPython上にVirtualnvを使って新しいPython解釈プログラムを作成することができます。
python 2.7では、ユーザごとに独立したsite-packagesを使用して実現することができます。