あまりにもハードあまりにもハード、私は我慢できない我慢できません
元类
原子力発電の前では、これは比較的に言えば、すべてのバックを強制的に私のロードすることができ、私はインストール開きたいです。
まず、メタクラスであるかを把握する必要があります。
私たちが知っている、Pythonで、すべてのものは実際には、クラスの前に元のことを学んだ、対象となっている、私は本当に私は、そのような概念は、元のクラスに会っ知っていることを知って、理解できない、私はこの概念の意味を実現しました。
私たちは、クラスを持って、その後、生成するには、このクラスのオブジェクトをインスタンス化し、どのように来るように何の考えは、存在しないこと、それはないはいため、クラスの外に、それが内部に何が起こるかについて考えていないこと操作?
実際には、彼はまた、オブジェクトのクラスで、彼はオブジェクトのメタクラスで、メタクラスは、クラスの外にあるオブジェクトをインスタンス化!今、そのオブジェクトの概念は、唯一のタイプのうちで制限インスタンス化されない、そしてすべてのものが対象となり、それが少しを感じることができないのですか?
明確な概念をメタクラスその後、クラスのメタクラスは、クラスオブジェクトのインスタンスです。だから、メタクラスは、どのように見えるかですか?
print(type(dict))
print(type(list))
print(type(str))
print(type(object))
print(type(type))
<クラスの型'>
<クラスの型'>
<クラスの型'>
<クラスの型'>
<クラス「タイプ」>
私たちは、クラスのこれらのタイプは、タイプのすべての種類、さらには型自体あるタイプのクラスで見ることができます。
だから、基本的には、識別されたタイプ、メタクラスです。そして、すべてのクラスは、オブジェクトをインスタンス化するために、そのうちでインスタンス化して、インスタンス化されたクラスのうちされています。
メタクラスは、クラス、ファーストクラスの元なのでまあ、どのように来ますか?まず、鶏が先か卵が先か?最初のメタクラス私たちはすべてが正確に何かを説明会っ少し馬鹿を理解して信じているC言語で書かれている、あなたが言うことができるがCで書かれています 。。。。
私はこれについて考えていない、と彼は物事の一番下です。
クラス分析の基礎となる原則
私たちは、クラスに建設され、そのクラス+クラス名を知っている、と私たちは知っているいずれかによって、実際には、我々はそう単純では思わなかった、実際には、このオブジェクトを作成したクラスのメタクラスのインスタンスです。
実際には、そのような段階を経ています。
Person=type('Person',(object,),dict)
戻り値はクラスの一種で、人はこの戻り値を受け取り、その人に割り当てられた、「人のクラスが呼び出されます。あなたは、さまざまなオブジェクトをインスタンス化するために、この人を使用することができます。
まず、各パラメータの役割、最初の引数についての話、クラスの名前を作成することは明らかであり、第二は、親クラスから継承するために、そのクラスである、ので、フォームまたはタプルのリストで記述する必要がありますあなただけのクラスを継承していない、第三は、辞書、その中に書かれているものを、その後の辞書を、鍵となるのですか?あなたは時間の前にクラスを作成することを思い出して、多くの点で、今回はこれらのプロパティとメソッドは、すべてこの辞書内で行くことにプッシュされる財産の多くを、書くことではありません
l={}
exec('''
school='oldboy'
def __init__(self,name):
self.name=name
def score(self):
print('分数是100')
''',{},l)
execメソッド、三つのパラメータの合計、最初は文字列であり、第二は、辞書を格納するグローバル変数であり、第三は、ローカル変数の辞書を格納している、我々は内部のもののようなものを取らなければならないので、我々は必要なものです第3のパラメータ、次いで全体にパラメータの最初の位置にコードブロックのL、この効果幹部、彼は単なる文字列の内部、及びコードを実行するには、様々な名前空間を生成しますそして第3のパラメータL内の名前空間との間のマッピングが存在し、Lは、マッピング関係の内部に保持されていると言うことができます。それでは、この印刷リットルを見てみましょう。
{'school': 'oldboy', '__init__': <function __init__ at 0x0000016746FD1EA0>, 'score': <function score at 0x00000167471BD048>}
案の定、それはリポジトリマッピング辞書で、その後、私たちは辞書の三番目のパラメータの種類を投げました
Person=type('Person',(object,),l)
ケースとなり、その後、ここで、それは我々がのオブジェクトをインスタンス化するPersonクラスを使用することができ、良いクラスを生成しました。
確かに一部の人々は、このような問題を抱えている、なぜ型正方3つのパラメータは、クラスを生成し、パラメータは、戻り値の型である置きます。
彼がそのようなソースであり、参照してください。私たちは、クラスのメタクラスインスタンスのこのタイプを使用し、それはとても具体的であるタイプのinitメソッドを呼び出します。
クラスのメタクラスを発生させることによって制御さ
我々は、我々は、我々はメタクラスそれによって生成されたクラスをどのように制御するか、動くことができない、我々はデフォルトの元の、他の種類、自分で書く、書くことができメタクラスタイプは、書かれていることを知っています自分のクラスのメタクラスは十分に書き込みます。
カスタムメタクラス:生成されたクラスを制御するために:あなたは、クラス名を制御することができ、親クラスは、コントロールクラスの名前空間のコントロールを継承することができます
カスタムメタデータクラスは、このクラスがメタクラスと呼ばれる、タイプ継承するクラスを作成し、タイプを継承しなければなりません
class Mymeta(type):
# def __init__(self,*args,**kwargs):
def __init__(self,name,bases,dic):
# self 就是Person类
# print(name)
# print(bases)
# print(dic)
だから私たちは、カスタムのメタクラスを記述します。
少し運動を行います
演習1:無制限のコントロールクラス名はSBで開始する必要があります。
class Mymeta(type):
# def __init__(self,*args,**kwargs):
def __init__(self,name,bases,dic):
if not name.startswith('sb'):
raise Exception('类名没有以sb开头')
たとえば、私たちはクラスをインスタンス化
class person(metaclass=Mymeta):
name='nick'
私たちは、彼のメタクラスではなく、デフォルトのタイプで、私たちのカスタムそのクラスで指定され、内部の括弧クラスでメタクラス= Mymetaを追加しました。今回我々は、(すなわち、自分のクラス名を)名前塩基(すなわち、その親クラス、なしがあります)、およびDIC(そのコードブロック)は、カスタムのinitメソッドのメタクラスに次の操作を渡しますあなたは理解するだろう。
練習2:クラスは、コメントを追加しなければなりません
class Mymeta(type):
# def __init__(self,*args,**kwargs):
def __init__(self,name,bases,dic):
if not self.__dict__['__doc__']:
raise Exception('类里没有注释')
これは、同じ理由を説明することではありません
クラスを呼び出すことによって、監察院のクラスを処理
これとどのような違いの上には、それをしませんか?
違いは、これが詳細であることです
コールプロセス制御クラス、実際には、コントロールに:生成されたオブジェクト
どのように達成するために?__call__で達成するために
例えば、我々は、新しいクラスがqssbで始まり、あなたは内部コールの判定ロジックを記述することができます生成する必要があります。
class Mymeta(type):
def __call__(self, *args, **kwargs):
obj=object.__new__(self)
obj.__init__(*args, **kwargs)
# print(obj.__dict__)
if not obj.__class__.__name__.startswith('qssb'):
raise Exception('类名没有以qssb开头')
return obj
class Person(object,metaclass=Mymeta):
school='oldboy'
def __init__(self,name):
self.name=name
def score(self):
print('分数是100')
p=Person('nick')
print(p.name)
私は疲れて、このコードを説明しません。
あなたがpの外にインスタンス化するので、人を()を呼び出し、それが彼の__call__メソッドのメタクラスを実施し、独自の初期化中のコールがあり、それを理解してそう。まず、クラスの名前を書いて、あなたは空のオブジェクトをインスタンス化することができます彼のカッコで、新しい見てください。そして、あなたは理解して
プロパティがメタクラスされた後に見て
Propertyクラスの検索順序:---> --->で入力エラーの独自の定義を見つけるために、親クラスに---> MROの継承を探す---->元のクラスを見つけるために、クラス自体で始まります
> --- --->エラーを見つけるための親クラスへ---> MROの継承を見つけるためのクラスを見つけるために、オブジェクト自身で始まる:オブジェクトは、順序属性検索します
エンドエンド、背中の痛み