美文网首页
面向对象编程(python)

面向对象编程(python)

作者: endian | 来源:发表于2018-01-19 14:20 被阅读0次

    面向对象编程

    self


    • 类方法与普通函数只有一种特定的区别----前者必须有一个额外的名字,这个名字必须添加到参数列表的开头,但是你不用再调用这个功能时为这个参数赋值

    • 按照惯例,它被赋予self这一名称

    • Sample Code

        class Person:
        def say_hi(self):
            print('say hi!!!');
        p = Person();
        p.say_hi();
      

    init方法


    • 会在类的对象被实例化时立即执行
    • Sample Code:
        class Person:
            def __init__(self,name):
                self.name = name;
            def say_hi(self):
                print('say hi!!! to',self.name);
        p = Person("endian11");
        p.say_hi();
    

    类变量与对象变量


    • 数据部分也就是字段,只不过是绑定到类与对象的命名空间。这就代表着这些名称仅在这些类与对象所存在的上下文中有效

    • 字段有两种类型

      • 类变量
        • 类变量是共享的,它可以被属于该类的所有实例访问
      • 对象变量
        • 由类的每一个独立的对象或实例所拥有
    • Sample Code

      class Robert:
          """表示有个带有名字的机器人."""
          population = 0;#一个类变量,用来计数机器人的数量
          def __init__(self,name):
              '''初始化数据'''
              self.name = name;
              print("(Initializing {})".format(self.name));
              Robert.population +=1;
          def die(self):
              '''我挂了。。'''
              print('{} is beging destroyed!'.format(self.name));
              Robert.population -=1;
              if Robert.population ==0:
                  print('{} was the last one.'.format(self.name));
              else:
                  print("There are still {:d} roberts working.".format(Robert.population));
          def say_hi(self):
              '''来自机器人的诚挚问候
              
              没问题,你做的到。'''
              print("Greetings, my masters call me {}.".format(self.name));
          @classmethod
          def how_many(cls):
              '''打印出当前的人口数量'''
              print("We have {:d} robots.".format(cls.population));
              
      droid1 = Robert("R2-D2");
      print(droid1.__init__.__doc__);
      droid1.say_hi();
      Robert.how_many();
      droid2 = Robert("c-3P0");
      droid2.say_hi();
      Robert.how_many();
      print("\nRobots can do some work here.\n");
      print("Robots have finished their work,so let us  destroy them");
      droid1.die();
      droid2.die();
      Robert.how_many();
      
      • 运行结果:

          (Initializing R2-D2)
          初始化数据
          Greetings, my masters call me R2-D2.
          We have 1 robots.
          (Initializing c-3P0)
          Greetings, my masters call me c-3P0.
          We have 2 robots.
          
          Robots can do some work here.
          
          Robots have finished their work,so let us  destroy them
          R2-D2 is beging destroyed!
          There are still 1 roberts working.
          c-3P0 is beging destroyed!
          c-3P0 was the last one.
          We have 0 robots.
        

    继承


    • 面向对象编程的一大优点是对代码的重用

    • SampleCode:

        class SchoolMember:
        '''代表学校里的成员。'''
        def __init__(self,name,age):
            self.name = name;
            self.age = age;
            print('(Initialized SchoolMember:{})'.format(self.name));
        def tell(self):
            '''告诉我有关我的细节。'''
            print('Name:"{}" Age:"{}"'.format(self.name,self.age),end=" ");
        class Teacher(SchoolMember):
            '''代表一位老师。'''
            def __init__(self,name,age,salary):
                SchoolMember.__init__(self,name,age);
                self.salary = salary;
                print('Initialized Teacher:{}'.format(self.name));
            def tell(self):
                SchoolMember.tell(self);
                print('Salary {:d}:'.format(self.salary));
                
        class Student(SchoolMember):
            def __init__(self,name,age,marks):
                SchoolMember.__init__(self,name,age);
                self.marks = marks;
                print('Initialized Student:{}'.format(self.name));
            def tell(self):
                SchoolMember.tell(self);
                print('Marks:"{:d}"'.format(self.marks));
        
        t = Teacher("Li Zhanwei",28,25000);
        s = Student("Li Xiaolong",22,66);
        t.tell();
        s.tell();
        
        print();
        
        members = {t,s};
        for m in members:
            m.tell();
      
      • 如果基类和子类都有相同的方法,python代码不会自动调用基类的函数,需要自己显式地调用

    相关文章

      网友评论

          本文标题:面向对象编程(python)

          本文链接:https://www.haomeiwen.com/subject/agbooxtx.html