Maison  >  Article  >  développement back-end  >  Orienté objet avancé

Orienté objet avancé

巴扎黑
巴扎黑original
2017-06-23 14:46:191189parcourir

Partie de syntaxe avancée orientée objet

Par @staticmethod Le décorateur peut transformer la méthode décorée en méthode statique. Qu'est-ce qu'une méthode statique ? En fait, il n'est pas difficile de comprendre que les méthodes ordinaires peuvent être appelées directement après l'instanciation, et que les variables d'instance ou de classe peuvent être appelées via self dans la méthode, mais que les méthodes statiques ne peuvent pas accéder aux variables d'instance ou de classe, et on ne peut pas y accéder. l'instance. Les méthodes des variables et des variables de classe n'ont en réalité rien à voir avec la classe elle-même. Son seul lien avec la classe est que la méthode doit être appelée via le nom de la classe.

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)

Dans le code ci-dessus, member_nums est une variable de classe Si s1.member_nums est appelé directement, la valeur de la classe est appelée si s1 ; . member_nums = 666, ce qui équivaut à ajouter une nouvelle variable à l'instance. À ce stade, lors de la modification de la valeur de la classe, cela n'affectera pas la valeur de la variable dans l'instance. La sortie du code ci-dessus est la suivante :

avant : 0
avant : 12
après : 666
après : 666

Méthode statique de classe @staticmethon :

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

Dans le code ci-dessus, s'il n'y a pas de @staticmethon, il n'y en aura certainement pas problème dans l'exécution du code, mais lorsque c'est le cas. Lors de l'utilisation de @staticmethod, le système indique qu'un paramètre est manquant. Si nous transformons une méthode en méthode statique, alors cette méthode n’a pas grand-chose à voir avec l’instance.

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 La méthode statique consiste à rendre la méthode de la classe non liée à la classe, et elle ne peut être appelée qu'en passant des paramètres lorsque appel.

Méthode de classe

La méthode de classe passe @classmethod Implémentation du décorateur, le La différence entre les méthodes de classe et les méthodes ordinaires est que les méthodes de classe ne peuvent accéder qu'aux variables de classe et ne peuvent pas accéder aux variables d'instance

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()

Dans le code ci-dessus, (1) Les classes ne peuvent pas accéder directement aux attributs dans les instances  ; (2) @classmethod est utilisé pour permettre au programme d'accéder uniquement aux variables de la classe, telles que SchoolMember dans le code ci-dessus .member_nums, c'est une méthode de classe, nous pouvons y accéder en conversation, mais nous ne pouvons pas accéder à self.name, car @classmethod ne peut accéder qu'aux attributs de classe.

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'

Comme le montre ce qui précède, le code ci-dessus @classmethon interdit les instances dans le Variables de classe, seules les variables de classe peuvent être utilisées. Autrement dit, self.name, self.age et self.sex ne peuvent pas être utilisés, seules les variables des classes self.nember_nums et SchoolMember.member_nums peuvent être utilisées. Comme suit :

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

Méthode d'attribut

Attribut La fonction de la méthode est de transformer une méthode en propriété statique via @property

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

Si @property n'est pas ajouté, le programme peut s'exécuter normalement. Mais après avoir ajouté @property, une erreur se produit lors de l'exécution du programme. Quelle en est la raison ? Parce que @property transforme les méthodes de classe en attributs de classe, lors de l'appel, il suffit d'exécuter s1.walk() sans ajouter de parenthèses, comme suit :

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

Dans le code ci-dessus, @property transforme la méthode de classe en propriété membre. Nous pouvons l'appeler directement en utilisant s1.walk.

Classique vs nouveau style

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()

Dans le code ci-dessus, la classe D hérite de la classe B et de la classe C. Lorsque nous exécutons la méthode dans la classe D, nous recherchons d'abord dans la classe B. Cette classe classique et la nouvelle classe The les classes sont toutes identiques. Si la recherche est introuvable, la classe classique est recherchée dans la classe A, tandis que la nouvelle classe est recherchée dans la classe C. L'exemple est le suivant : (Remarque : la différence doit être exécutée dans la version 2. X. 3 Si . (Classe de nouveau style) Exécutez d'abord la classe du même niveau

(2 ) Cours classique (exécuter le précédent cours de premier niveau)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn