zoukankan      html  css  js  c++  java
  • python学习第六天----面向对象

    1.创建一个类:

    class Student():
        name = ''
        age = 0
    
        def print_file(self):
            print('name: ' + self.name)
            print('age: ' + str(self.age))
    
    
    #实例化
    student = Student()
    student.print_file()
    #name:
    #age: 0
      1. 类中函数的定义必须有self形参。这个形参指向这个类
      2. 调用类中的变量需要通过self去调用

     类的定义:

      类是现实世界或思维世界中的实体在计算机中的反映。它将数据以及这些数据上的操作封装在一起。
      实例化: 就是讲零件(参数)放到这个类的工厂中,加工出来的不同的对象。
     

    2.构造函数:(__init__)

    class Student():
        name = ''
        age = 0
    
        def __init__(self):
            # 构造函数
            print('student')
    
        #行为与特征
        def do_homework(self):
            print('homework')
    
    student1 = Student()
    # student
      1. 构造函数的调用是在实例化时自动执行的。我们也可以显式的去调用。
    student1.__init__();
      构造函数与普通函数的区别:构造函数返回为None,而且,自定义返回值时也只能是None
    class Student():
        name = ''
        age = 0
    
        def __init__(self, name, age):
            # 构造函数
            # 初始化对象的特征
            self.name = name
            self.age = age
    
    
    
        #行为与特征
        def do_homework(self):
            print('homework')
    
    student1 = Student('孙悟空', '1000')
    print(student1.name)
    print(student1.age)

      在构造方法中可以初始化对象的一些静态变量。

    类变量与实例变量:

      类变量指的是定义类的时候,类里边定义的变量。如name和age。
     

      self不是关键字,可以命名为其他的名字(标识符),但是python建议我们使用self。
      self是和对象实例相关联的,可以调用实例方法。
     
      

    探究类 与对象的变量查找顺序

    class Student():
        name = 'qiyue'
        age = 0
    
        def __init__(self, name, age):
            # 构造函数
            # 初始化对象的特征
            name = name
            age = age
    
    
    
        #行为与特征
        def do_homework(self):
            print('homework')
    
    student1 = Student('孙悟空', '1000')
    print(student1.name)
    #qiyue
      此时打印student1对象字典:
    print(student1.__dict__)
    #{}
      修改:
    class Student():
        name = 'qiyue'
        age = 0
    
        def __init__(self, name, age):
            # 构造函数
            # 初始化对象的特征
            self.name = name
            self.age = age
    
    
    
        #行为与特征
        def do_homework(self):
            print('homework')
    
    student1 = Student('孙悟空', '1000')
    # print(student1.name)
    print(student1.__dict__)
    #{'name': '孙悟空', 'age': '1000'}
      
      对对象内的属性查找顺序----如果有实例变量,就获取实例变量,如果没有实例变量,就获取类变量。
    class Student():
        name = 'qiyue'
        age = 0
    
        def __init__(self, name, age):
            # 构造函数
            # 初始化对象的特征
            self.name = name
            self.age = age
    
    
    
        #行为与特征
        def do_homework(self):
            print('homework')
    
    student1 = Student('孙悟空', '1000')
    print(student1.name)
    print(Student.name)
    print(student1.__dict__)
    print(Student.__dict__)
    结果如下:
    孙悟空
    qiyue
    {'name': '孙悟空', 'age': '1000'}
    {'__module__': '__main__', 'name': 'qiyue', 'age': 0, '__init__': <function Student.__init__ at 0x000002326DF3A0D0>, 'do_homework': <function Student.do_homework at 0x000002326DF3A160>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}

    在实例中访问实例变量和类变量:

    class Student():
       
        sum = 0
        name = 'qiyue'
        age = 0
    
        def __init__(self, name, age):
            # 构造函数
            # 初始化对象的特征
            self.name = name
            self.age = age
            print(Student.sum)
            print(self.sum)
            print(self.__class__.sum)
    
    
        #行为与特征
        def do_homework(self):
            print('homework')
    
    student1 = Student('孙悟空', '1000')
    
    #结果是
    # 0
    # 0
    # 0
     
    修改类变量。
    class Student():
       
        sum = 0
        name = 'qiyue'
        age = 0
    
        def __init__(self, name, age):
            # 构造函数
            # 初始化对象的特征
            self.name = name
            self.age = age
            self.__class__.sum += 1
            print('当前班级总数为' + str(self.__class__.sum))
    
    
        #行为与特征
        def do_homework(self):
            print('homework')
    
    student1 = Student('孙悟空', '1000')
    student2 = Student('李哪吒', '1000')
    student2 = Student('姜尚', '1000')
    student2 = Student('姬发', '1000')
    student2 = Student('九尾狐', '1000')
    student2 = Student('子受', '1000')
    #打印结果:
    #当前班级总数为1
    #当前班级总数为2
    #当前班级总数为3
    #当前班级总数为4
    #当前班级总数为5
    #当前班级总数为6

    类方法:

    class Student():
       
        sum = 0
        name = 'qiyue'
        age = 0
    
        def __init__(self, name, age):
            # 构造函数
            # 初始化对象的特征
            self.name = name
            self.age = age
            self.__class__.sum += 1
            print('当前班级总数为' + str(self.__class__.sum))
    
    
        #行为与特征
        #实例方法
        def do_homework(self):
            print('homework')
        
    
        #类方法 --- 装饰器,需要一个特定的指向,等同实例方法的self,但是python建议使用cls
        @classmethod
        def plus_sum(cls):
            cls.sum += 1
            print(cls.sum)
    
    student1 = Student('石敢当', 18)
    Student.plus_sum()
    student1 = Student('孙悟空', 18)
    Student.plus_sum()
    student1 = Student('贾宝玉脖子上的石头', 18)
    Student.plus_sum()
    打印结果:
    当前班级总数为1
    2
    当前班级总数为3
    4
    当前班级总数为5
    6
    python允许对象调用类的方法。
     
     

    静态方法:

      静态方法与类方法和实例方法的不同:
        ⑴ 静态方法不必强制传入self或者cls(self指的是实例本身,cls指的是类本身)
     
    class Student():
       
        sum = 0
        name = 'qiyue'
        age = 0
    
        def __init__(self, name, age):
            # 构造函数
            # 初始化对象的特征
            self.name = name
            self.age = age
    
        #行为与特征
        #实例方法
        def do_homework(self):
            print('homework')
        
    
        #类方法 --- 装饰器,需要一个特定的指向
        @classmethod
        def plus_sum(cls):
            cls.sum += 1
            print(cls.sum)
    
        #静态方法
        @staticmethod
        def add(x, y):
            print(Student.sum)
            print('This is a static method')
    
    student1 = Student('石敢当', 18)
    Student.add(1, 2)
    student1.add(2,3)
      打印结果:
    0
    This is a static method
    0
    This is a static method
      说明由类或者实例都可以调用静态方法。

    成员可见性:公开和私有

      如果给方法名或变量名前加上双下划线,而方法名或或变量名后面没有双下划綫,python则认为这个方法为私有的。同时应极力避免在方法名后加双下划线,以分开python内置方法和自定义方法
    class Student():
        
        name = 'qiyue'
        age = 0
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
            self.score = 0
    
    
        def __marking(self, score):
            self.score = score
            print(self.name + '同学本次考试分数为' + str(self.score))
    
    
    student1 = Student('石敢当', 18)
    student1.__marking(59)
    结果是:
    Traceback (most recent call last):
      File "c2.py", line 41, in <module>
        student1.__marking(59)
    AttributeError: 'Student' object has no attribute '__marking'
      在类以外,可以通过类名.方法来执行所有的类里边的所有的非私有方法。
     
      注意点:
    class Student():
       
        sum = 0
        name = 'qiyue'
        age = 0
    
        def __init__(self, name, age):
    
            self.name = name
            self.age = age
            self.__score = 0
    
        def ___marking(self, score):
            self.__score = score
            print(self.name + '同学本次考试分数为' + str(self.score))
            
        #静态方法
        @staticmethod
        def add(x, y):
            print(Student.sum)
            print('This is a static method')
    
    student1 = Student('石敢当', 18)
    print(student1.__score)
      打印结果:
    Traceback (most recent call last):
      File "c2.py", line 41, in <module>
        print(student1.__score)
    AttributeError: 'Student' object has no attribute '__score'
     
      此时是访问不到的,但是赋值呢?修改最后一句代码:
    student1.__score = -1
    print(student1.__score)
      打印结果是:-1
      那么,此时是私有变量被修改为共有变量了么?
    class Student():
       
        sum = 0
        name = 'qiyue'
        age = 0
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
            self.__score = 0
    
        def marking(self, score):
            self.__score = score
            print(self.name + '同学本次考试分数为' + str(self.__score))
    
        def getScore(self) :
            print(self.__score)
    
       
    student1 = Student('石敢当', 18)
    student1.marking(50)
    student1.__score = -1
    print(student1.__score)
    student1.getScore()
    print(student1.__dict__)
      结果是:
    石敢当同学本次考试分数为50
    -1
    50
    {'name': '石敢当', 'age': 18, '_Student__score': 50, '__score': -1}
      由此可见,私有变量__score被被替换为名_Student__score的共有变量,且可以通过实例方法中的self.__score获取到。

    继承:

      c4.py中的内容:
    class Human():
    
        sum = 0
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def get_name(self):
            print(self.name)
      
      c3.py中的内容:
    from c4 import Human
    
    class Student(Human):
    
        def do_homework(self):
            print('english homework')
    
    student1 = Student("曹雪芹", 220)
    print(student1.sum)
    print(Student.sum)
    print(student1.name)
    print(student1.age)
    student1.get_name()    
      
      Student被称为Human的子类,Human也就是Student的父类。
      运行c3的结果是:
     
    0
    0
    曹雪芹
    220
    曹雪芹
      可以看出,方法和变量皆被继承。
      python是允许多继承的。
      对于继承时变量如何传递?修改c3
     
    from c4 import Human
    
    class Student(Human):
    
        def __init__(self, school, name, age):
            self.school = school
            Human.__init__(self,name, age)
    
        def do_homework(self):
            print('english homework')
    
    student1 = Student("没有", "曹雪芹", 220)
    print(student1.name)
    print(student1.age)
    student1.get_name()
    打印结果:
    曹雪芹
    220
    曹雪芹

    关键字: super

      它是代表父类的关键字。当父类的方法名与子类的方法名相同时,通过实体类点出来的方法是子类的。此时,可以通过super来调用父类的同名方法。代码验证如下:
      c4中在Human类下增加do_homework方法:
     
     def do_homework(self):
            print("this is parent method")
      修改c3:
    from c4 import Human
    
    class Student(Human):
    
        def __init__(self, school, name, age):
            self.school = school
            # Human.__init__(self,name, age)
            super(Student, self).__init__(name, age)
    
        def do_homework(self):
            super(Student, self).do_homework()
            print('english homework')
    
    student1 = Student("没有", "曹雪芹", 220)
    student1.do_homework()

    打印的结果是:

    this is parent method
    english homework

  • 相关阅读:
    服务器错误日志
    IfcCurveBoundedSurface
    Ifc发展历史与版本介绍
    IfcCurveBoundedPlane
    IfcRationalBSplineSurfaceWithKnots
    IfcBSplineSurfaceWithKnots
    QDateTime QString
    IFC4 标准中的流程实体
    IFC 标准的定义
    MultipartFile
  • 原文地址:https://www.cnblogs.com/dsweb/p/14084916.html
Copyright © 2011-2022 走看看