ホームページ  >  記事  >  バックエンド開発  >  オブジェクト指向の高度な

オブジェクト指向の高度な

巴扎黑
巴扎黑オリジナル
2017-06-23 14:46:191140ブラウズ

高度なオブジェクト指向構文部分

@staticmethod デコレータを介して、装飾されたメソッドを 静的メソッド に変えることができます。実際、通常のメソッドはインスタンス化後に直接呼び出すことができ、インスタンス変数やクラス変数はメソッド内で self を介して呼び出すことができますが、静的メソッドはインスタンス変数やクラス変数にアクセスできず、アクセスできないことを理解するのは難しくありません。変数とクラス変数のメソッドは、実際にはクラス自体とは何の関係もありません。クラスとの唯一の関係は、メソッドをクラス名を通じて呼び出す必要があることです。

class SchoolMember(object):
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

    member_nums = 0def introduce(self):
        print("My name is %s,and I am %s year old." %(self.name,self.age))

    @staticmethod
    def talk():
        print("I like to study python")class Teacher(SchoolMember):
    def __init__(self,name,age,sex,course,salary):
        super(Teacher,self).__init__(name,age,sex)
        self.course = course
        self.salary = salary

    def Teaching(self):
        print("Teacher %s is teaching %s." %(self.name,self.course))



s1 = Teacher("alex",22,"Femal","python",10000)

print("before:",s1.member_nums)
SchoolMember.member_nums = 12print("before:",s1.member_nums)


s1.member_nums = 666     #是在类中重新生成一个变量

print("after:",s1.member_nums)
SchoolMember.member_nums = 12print("after:",s1.member_nums)

上記のコードでは、member_nums がクラス変数である場合、s1.member_nums = 666 の場合はクラス内の値が呼び出されます。インスタンス。現時点では、クラスの値を変更しても、インスタンス内の変数の値には影響しません。上記のコードの出力は次のとおりです:

before: 0
before: 12
after: 666
after: 666

クラス @staticmethon:

 SchoolMember(====  %  % %= SchoolMember(,,

の静的メソッド@staticmethod を使用すると、コードの実行にまったく問題はありませんが、@staticmethod を使用すると、パラメーターが 1 つ欠落しているというメッセージがシステムから表示されます。メソッドを静的メソッドに変えると、このメソッドはインスタンスとはほとんど関係がなくなります。

class SchoolMember(object):
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

    member_nums = 0def introduce(self):
        print("My name is %s,and I am %s year old." %(self.name,self.age))

    @classmethod        #类方法,不能访问实例变量
    def talk(self):
        print("%s like to study python"  %SchoolMember.member_nums)

    @staticmethod        #让方法在类中剥离,与类没有关系,调用要传递参数
    def walk(self):
        print("%s is walking......" %self)


#SchoolMember.talk()    #不能调用,类是没有办法访问实例变量,只能访问自己
s1 = SchoolMember("Alex",22,"Female")  #实例化
s1.walk("alex")

@staticmethod 静的メソッドとは、クラス内のメソッドをクラスと無関係にし、呼び出し時にパラメータを渡さないと呼び出すことができません。

クラスメソッド

クラスメソッドは @classmethod デコレーターを通じて実装されます。 クラスメソッドと通常のメソッドの違いは、クラスメソッドはインスタンス変数ではなくクラス変数にのみアクセスできることです

class SchoolMember(object):
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

    member_nums = 0def introduce(self):
        print("My name is %s,and I am %s year old." %(self.name,self.age))

    #@classmethod        #类方法,不能访问实例变量
    def talk(self):
        print("%s like to study python"  %self.name)

SchoolMember.member_nums
#SchoolMember.talk()    #不能调用,类是没有办法访问实例变量,只能访问自己
s1 = SchoolMember("Alex",22,"Female")  #实例化
s1.talk()
上記のコードでは、

(1) クラスはインスタンス内の属性に直接アクセスできません; (2) @classmethod の機能は、プログラムがクラス内の変数 (例: SchoolMethod) にのみアクセスできるようにすることです。上記のコード .member_nums 、これはクラス メソッドです。トーク内でアクセスできますが、@classmethod はクラス属性にしかアクセスできないため、self.name にはアクセスできません。

class SchoolMember(object):
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

    member_nums = 0def introduce(self):
        print("My name is %s,and I am %s year old." %(self.name,self.age))

    @classmethod        #类方法,不能访问实例变量
    def talk(self):
        print("%s like to study python"  %self.name)

SchoolMember.member_nums
#SchoolMember.talk()    #不能调用,类是没有办法访问实例变量,只能访问自己
s1 = SchoolMember("Alex",22,"Female")  #实例化
s1.talk()

运行结果如下:
Traceback (most recent call last):
  File "/home/zhuzhu/day7/staticmethon方法.py", line 18, in <module>s1.talk()
  File "/home/zhuzhu/day7/staticmethon方法.py", line 13, in talk
    print("%s like to study python"  %self.name)
AttributeError: type object 'SchoolMember' has no attribute 'name'
上記のコード @classmethon ではクラス内でのインスタンス変数の使用が禁止されており、クラス変数のみが使用可能です。つまり、self.name、self.age、self.sex は使用できず、self.nember_nums クラスと SchoolMember.member_nums クラスの変数のみが使用できます。以下の通り:

class SchoolMember(object):
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

    member_nums = 0def introduce(self):
        print("My name is %s,and I am %s year old." %(self.name,self.age))

    @classmethod        #类方法,不能访问实例变量
    def talk(self):
        print("%s like to study python"  %SchoolMember.member_nums)

SchoolMember.member_nums
#SchoolMember.talk()    #不能调用,类是没有办法访问实例变量,只能访问自己
s1 = SchoolMember("Alex",22,"Female")  #实例化
s1.talk()

运行结果如下:0 like to study python

プロパティメソッド

プロパティメソッドの機能は、 @property を通じてメソッドを静的プロパティに変えることです

 SchoolMember(====  %  % %= SchoolMember(,,
追加されていない場合@property ワード、プログラム 正常に実行できるのですが、@property を追加するとプログラムを実行するとエラーが発生します。原因は何ですか? @property はクラスメソッドをクラス属性に変換するため、呼び出し時に次のように括弧を追加せずに s1.walk() を実行するだけで済みます。

 SchoolMember(====  %  % %= SchoolMember(,,
上記のコードでは、@property はクラスを回すメソッドをメンバー属性に追加すると、s1.walk を使用して直接呼び出すことができます。

クラシック vs 新しいスタイル

class A:             #经典类的写法,新式类是A(object)尽量少用经典类,都用新式类现在
    def __init__(self,name):
        self.name = name

    def f1(self):
        print("f1,搞基")class B(A):
    def __init__(self,name):
        super(B,self).__init__(name)

    # def f1(self):
    #     print("f1,来呀")class C(A):
    def __init__(self,name):
        super(C,self).__init__(name)

    #def f1(self):
        #print("f1,一起搞!")class D(B,C):
    pass

d = D("Alex")
d.f1()

上記のコードでは、クラス D はクラス B とクラス C を継承します。クラス D のメソッドを実行するとき、まずクラス B を検索します。この古典的なクラスと新しいクラスは同じです。クラシック クラスはクラス A で検索され、新しいクラスはクラス C で検索されます。例は次のとおりです。 (注: 違いはバージョン 2.X で実行する必要があります。3.X は最適化されており、クラス B では見つからない場合は、クラス C で検索してください)

従来のクラスと新しいスタイルのクラスの実行順序は次のとおりです:

(新しいスタイルのクラス) 同じレベルのクラスが最初に実行されます。

(2 ) クラシッククラス (前のクラスを先に実行)

以上がオブジェクト指向の高度なの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。