• 【我要学python】面向对象系统学习


    第一节:初识类的定义和调用 c1.py

    #类 = 面向对象

    #类 最基本作用:封装

    #类中不仅可以定义变量 还可以定义函数等等,例:

    1 class student( ):
    2     name = ' '
    3     age = 0
    4     
    5     def print_file():
    6         pass

    #类的实例化

     1 s = student()

    #调用类方法

    2 s.print_file()

    #类中编写的函数与普通编写的函数有区别——self ,例:

    class student( ):
        name = ' '
        age = 0
        
        def print_file(self):   #要调用类自身的变量需要加上self
           print('name:' + self.name)   
           print('age:' + str(self.age))   
    
        #print_file() 报错 类负责定义封装 不要在类里调用

    第二节:函数与方法的区别 c2.py

    #如何在另外一个模块使用我们的类

    1 #c2.py调用c1.py的类
    2 from c1 import student
    3 s = student()
    4 s.print_file()

    #方法和函数的区别

    多数情况下,c,c++把此概念称为函数;java,c#把此概念称为方法。

    方法:设计层面的称谓

    函数:程序运行,过程式的称谓

    也就是说面向对象更关心代码的设计

    #类中的变量

    变量:在类中被称为数据成员

    体现类的封装性

    第三节:类与对象 c3.py

    #类和对象到底是什么?它们有什么关系?

    类是现实世界或思维世界中实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起

    类和对象通过实例化关联在一起

    #类的设计在于 行为与特征 的设计

     1 class student( ):
     2     name = ' '
     3     age = 0
     4     def do_homework(slef):
     5          print('homework')        
     6 
     7 #print_file 打印档案行为属于student主体明显不太适合 ,做作业的方法属于student方法没毛病
     8 
     9 class printer():    
    10     def print_file(self):   
    11        print('name:' + self.name)   
    12        print('age:' + str(self.age))

    #类像一个印刷机,能够通过模板做出各种各样的对象。

    通过student类(像一个模板模板)可以产生学生A,学生B...很多个对象,它们都有的特性是name和age

    第四节:构造函数

    #实例化

    a = student( ) #用student这个模板来创造实例a

    #构造函数的介绍:

    class student():
        def _init_(self):    #构造函数
            print('student')
    
    s1 = student()
    s1.__init__() 
    #输出
    student
    student 
    #有两个student 原因是:构造函数是调用时python使其自动进行的 无需再调用一次
    
    #注意:构造函数只能return None 也就是默认不写return

    #利用构造函数使对象实例化时多种多样

    class student():
        name = ' '
        age = 0
        def __init__(self,name,age):
            name = name  #这里python自己知道左边是变量 右边是形参 是合法的
            age = age
    
    s1 = student('大头',18) #实例化的多样性
    
    print(s1.name) 
    
    #输出空值 是为什么呢?!因为这里打印的是类变量name

    print(student.name)

    #同样输出 空值

    第四节,类变量和实例变量

    #类变量和实例变量

    类变量:与类关联的变量

    实例变量:和对象关联在一起的

    #用self完成实例变量的定义
    def __init__(self,name,age):
            self.name = name  
            self.age = age
    class student():
        name = '你的青'  #类变量
        age = 19
        def __init__(self,name,age):
            self.name = name   #实例变量
            self.age = age     #实例变量
    
    s1 = student('大头',19)
    print(s1.name)
    print(student.name)
    
    #输出
    
    大头
    你的青

    第五节:类与对象的变量查找顺序

    class student():
        name = '你的青 '
        age = 0
        def __init__(self,name,age):
            name = name  
            age = age
    
    s1 = student('大头',18) 
    
    print(s1.name) 
    print(student.name) 
    
    #输出
    你的青
    你的青
    
    #因为在外部调用时python首先寻找实例里面查找对应变量,没有找到的话就会去类变量里面寻找。

    第六节:self与实例方法

    class student():
        name = '你的青 '         #类变量
        age = 0
        def __init__(self,name,age):
            name = name  
            age = age        print(age)       #访问实例变量 最好是带上self. 
            print(name)      #没加self的读取的只是形参变量. 这里的age和name都是形参接收的值。
    
    s1 = student('大头',18) 
    
    #输出
    
    18
    大头

    #实例方法的特点即 方法第一个参数需要传入self

    第七节:在实例方法内部 中访问实例变量与类变量

    #总结已经学习的内容

    #方法来定义我们的行为和特征

    class student():
        sum1 = 0 
    
        def __init__(self,name,age):
            self.name = name
            self.age = age
            
            print(sum1)
    
    #输出
    
    'sum1' is not define 报错
     1 class student():
     2     sum1 = 0 
     3 
     4     def __init__(self,name,age):
     5         self.name = name
     6         self.age = age
     7         
     8         print(student.sum1) #在实例方法内访问类变量方法一
     9         print(self.__class__.sum1) #在实例方法内访问类变量方法二
    10 
    11 #输出
    12 
    13 0 
    14 0

    第八节:新方法——类方法

    #类变量的作用

     1 #实例方法操作类变量
     2 
     3 class student():
     4     sum1=0
     5     
     6     def __init__(self,name,age):
     7         self.name = name
     8         self.age = age
     9         self.__class__.sum1 += 1
    10         print("当前班级学生总数:" + str(self.__class__.sum1))
    11 
    12 s1 = student('小帅哥',18)
    13 s2 = student('小仙女',18)
    14 s1 = student('你的青',19)
    15 
    16 #输出
    17 当前班级学生总数:1
    18 当前班级学生总数:2
    19 当前班级学生总数:3

    #如何定义一个类方法

     1 class student():
     2     sum1 = 0
     3 
     4     def __init__(self,name,age):
     5         self.name = name
     6         self.age = age
     7 
     8     @classmethod  # 增加一个装饰器
     9     def plus_sum(cls):  # 默认cls 即class简写 也可以用self
    10         cls.sum1 += 1
    11         print("当前班级学生总数:" + str(cls.sum1))
    12 
    13 s1 = student('小帅哥', 18)
    14 student.plus_sum()
    15 s2 = student('小仙女', 18)
    16 student.plus_sum()
    17 s1 = student('你的青', 19)
    18 student.plus_sum()
    19 
    20 #输出
    21 当前班级学生总数:1
    22 当前班级学生总数:2
    23 当前班级学生总数:3

    #为什么要这样做?规范!和student实例对象无关的东西,例如班级总人数就可以放在类方法里

    第九节:新方法——静态方法

    class student():
         sum1 = 0
     
         def __init__(self,name,age):
             self.name = name
             self.age = age      
         
         @classmethod  # 增加一个类装饰器
         def plus_sum(cls):  # 默认cls 即class简写 也可以用self
             cls.sum1 += 1
             print("当前班级学生总数:" + str(cls.sum1))
    
         @staticmethod  # 增加一个静态装饰器
         def add(x,y):
            print('this is a static method')
    
    s1 = student
    s1.add(1,2)
    student.add(1,2)
    
    #输出
    this is a static method
    this is a static method
    
    #静态方法不同点 函数定义时参数不需要写self 调用时就要写class名
    #尽量少用静态方法 和类关联不大

    第十节:成员可见性:公开和私有

    #探讨python下面变量,方法的可见性

    #类的外部 类的内部

    class student():
         sum1 = 0
     
         def __init__(self,name,age):
             self.name = name
             self.age = age   
             self.score = 0
    
         def marking(self,score):    #python提倡所有对于类下面变量的更改通过方法来完成
         if score < 0:              #(粉色代码)这样规则和机制的灵活性很就高
         return '分数不能为负'
       self.score
    = score print(self.name + '同学本次考试分数为:' + str(self.score)) @classmethod # 增加一个类装饰器 def plus_sum(cls): # 默认cls 即class简写 也可以用self cls.sum1 += 1 print("当前班级学生总数:" + str(cls.sum1)) @staticmethod # 增加一个静态装饰器 def add(x,y): print('this is a static method') s1 = student('', 20) s1.marking(60) result = s1.marking(-6) print(result) #输出

    青同学本次考试分数为:60
    分数不能为负

    #如何使类的变量或者方法私有化(即类的外部无法访问调用)

    #在其他很多语言中,对类的范围是有明确要求的,private代表私有 public代表公开

    #在python中,私有化只需要添加双下划线

    class student():
     
         def __init__(self,name,age):
             self.name = name
             self.age = age   
             
         def __marking(self,score):    #这里添加了双下划线
         if score < 0:              
         return '分数不能为负'
       self.score = score
         print(self.name + '同学本次考试分数为:' + str(self.score))
    
    s1 = student('',20)
    s1.__marking(59)
    
    #输出 报错 此时__marking已经私有化
    AttributeError: 'student' object has no attribute '__marking'

    #构造函数属于python特有函数,自动执行,并且只能返回None,不过它可以从外部调用;小技巧:函数名的前后都添加双下划线的时候,python不会认为它是private。

    第十一节:没有什么是不能访问

    class student():
        def __init__(self, name, age):
            self.name = name
            self.age = age
            self.__score = 0  # 这里设定了实例的私有变量
        def marking(self, score):
            if score < 0:
             return '分数不能为负'
            self.__score = score
            print(self.name + '同学本次考试分数为:' + str(self.__score))
    s1 = student('', 20)
    s1.__score = 1
    print(s1.__score)  # 尝试输出私有变量
    
    #输出
    
    1  
    
    #因为动态语言强行赋值,此时的__score并不是私有变量student_score,可以通过print(s1.__dict__)验证


    1
    class student(): 2 def __init__(self, name, age): 3 self.name = name 4 self.age = age 5 self.__score = 0 # 这里设定了实例的私有变量 6 def marking(self, score): 7 if score < 0: 8 return '分数不能为负' 9 self.__score = score 10 print(self.name + '同学本次考试分数为:' + str(self.__score)) 11 s1 = student('', 20) 12 s1.__score = 1 13 print(s1.__score) # 尝试输出 14 15 s2 = student('',18) 16 print(s2.__score) # 尝试输出私有变量 17 18 #输出 报错 因为这里没有强制赋值 所以是直接想输出私有变量 19 AttributeError: 'student' object has no attribute 'student__score' 20 21 #其实python只是把私有变量改了名字而已 __score在里面就被改为_student__socre 22 23 class student(): 24 def __init__(self, name, age): 25 self.name = name 26 self.age = age 27 self.__score = 0 # 这里设定了实例的私有变量 28 def marking(self, score): 29 if score < 0: 30 return '分数不能为负' 31 self.__score = score 32 print(self.name + '同学本次考试分数为:' + str(self.__score)) 33 s1 = student('', 20) 34 s1.__score = 1 35 print(s1.__score) # 尝试输出 36 37 s2 = student('',18) 38 print(s2._student__score) # 尝试输出私有变量 39 40 #输出正常 41 1 42 0

    第十二节:面对对象三大 特性之 继承性

    #回顾之前所学内容

    #类由 类的特征 行为 方法 等等组成 继承性就是为了避免我们重复地写代码

    #例如 student类的父类还有human类

     1 #c5.py
     2 from c6 import Human               #标准的继承方法
     3 class student(Human):              #标准的继承方法
     4     sum = 0
     5     def __init__(self,name,age):
     6         self.name = name
     7         self.age = age
     8         self.score = 0
     9         self.__class__.sum += 1
    10 
    11     def do_homework(self)
    12         print('english homework')
    13 
    14 #c6.py
    15 class Human():
    16     pass

    #深化代码,使其有成为意义的继承

     1 #c6.py
     2 class Human():
     3     def __init__(self,name,age):
     4         self.name = name
     5         self.age = age
     6 
     7     def get_name(self):
     8         print(self.name)
     9 
    10 #c5.py
    11 from c6 import Human             #标准的继承方法
    12 class student(Human):              #标准的继承方法
    13     def do_homework(self):
    14         print('english homework')
    15 
    16 
    17 s1 = student('你的青',20)
    18 s1.get_name()
    19 print(s1.name)
    20 print(s1.age)
    21 
    22 #输出
    23 你的青
    24 你的青
    25 20

    #大多语言只能单继承,python的多继承功能有很大的利用空间

    #c6.py
    class Human():
          sum = 0
          def __init__(self,name,age):
            self.name = name
            self.age = age
    
    
          def get_name(self):
            print(self.name)
    
    # c5.py
    from c6 import Human  # 标准的继承方法
    class student(Human):  # 标准的继承方法
            
            def __init__(self,school,name,age):
               self.school = school            
               Human.__init__(self,name,age)  #调用父类的构造函数 从子类中传入父类 灵活的python通过Human类调用一个实例方法时 需要加self
    
    s1 = student('人民路','你的青',20)
    
    print(s1.school)
    print(s1.name)
    print(s1.age)
    
    #输出
    人民路
    你的青
    20

    #调用父类的构造函数还有第二种常用的方法:

    #c6.py
    class Human():
          sum = 0
          def __init__(self,name,age):
            self.name = name
            self.age = age
    
    
          def get_name(self):
            print(self.name)
    
    # c5.py
    from c6 import Human  # 标准的继承方法
    class student(Human):  # 标准的继承方法
            
            def __init__(self,school,name,age):
               self.school = school            
               super(student,self).__init__(name,age)  #调用父类的构造函数 这种方法为常用的方法 如果父类名有改变的话不会影响到此方法
    
    s1 = student('人民路','你的青',20)
    
    print(s1.school)
    print(s1.name)
    print(s1.age)
    
    #输出
    人民路
    你的青
    20

    #当父类和子类出现同名方法时,python会首先调用子类的方法

    #如果想调用父类的方法 同样用到super函数调用父类函数

    c6.py
    class Human():
          sum = 0
          def __init__(self,name,age):
            self.name = name
            self.age = age
    
    
          def do_homework(self):
            print('chinese homework')
    
    # c5.py
    from c6 import Human  # 标准的继承方法
    class student(Human):  # 标准的继承方法
            
            def __init__(self,school,name,age):
               self.school = school            
               super(student,self).__init__(name,age) 
    
            def do_homework(self):
               super(Student,self).do_homework()
               print('english homework')
        
     #调用父类的构造函数 这种方法为常用的方法 如果父类名有改变的话不会影响到此方法
    
    s1 = student('人民路','你的青',20)
    
    s1.do_homework()
    
    #输出
    chinese homework
    english homework
  • 相关阅读:
    写作的益处
    【转载】德鲁克:激发我一生的七段经历
    PS如何删除灰色的自动切片
    其他经验博文分类链接
    LODOP单个简短问答(小页面无需拖动滚动条)
    LODOP导出excel的页眉页脚
    LODOP导出和写入excel测试
    LODOP导出Excel简短问答和相关博文
    Lodop导出excel带数字格式
    LODOP批量打印判断是否加入队列1
  • 原文地址:https://www.cnblogs.com/tqing/p/10592234.html
Copyright © 2020-2023  润新知