Python面向对象编程

Stella981
• 阅读 663

本知识点参考廖雪峰的Python课程 [https://www.liaoxuefeng.com]

感谢北京图灵知非的免费课程 [http://www.tulingxueyuan.com/]

2018/6/25 星期一 9:56:21

Python面向对象编程--01

面向对象的概念

  • 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。

  • 在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义对象的数据类型就是面向对象中类(Class)的概念

  • 假如我们打印学生的成绩表

    • 面向过程会这样实现,我们程序的执行流程是:

        std1 ={'name':'yang','score':99}
        std2 = {'name':'wen','score':99}
        def print_score(std):
            print('{0}:{1}'.format(std['name'],std['score']))
      
  • 如果采用面向对象的设计思想。Student应该是一个对象,这个对象拥有name和score这两个属性,如果打印出学生的成绩,必须有student,然后才能把成绩打印出来:

          class Student(object):
          def __init__(self,name,score):
              self.name = name
              self.score = score
          def print_score(self):
              print('{0}:{1}'.format(self.name,self.score))
    
  • 给对象发消息实际上就是调用对象的相关函数,我们成为对象的方法:

          yang = Student('yangaoteng',100)
          wen = Student('wangwenwen',99)
          yang.print_score()
          wen.print_score()
    
  • 小结:

    • 面向对象是一种常见的思想,比方说数学公式就是众多经验统计出来的结果。比方说 动物、植物、都相当于类的概念
    • 在Python中,所有数据类型都可以视为对象。
    • 我们用 class创建类
    • init,相当于构造函数,就是函数必须输入的值。

类和实例

  • 面向对象最重要的两个概念就是 类(class)和 实例(Instance),类是抽象的模板(好比数学公式),而实例是根据类创建出来的’对象‘(好比用数学公式解出来的题)

  • 还以上面的例子,在Python中,定义类通过class关键字:

          class Student(object):
              pass
    
  • class后面跟着的是类名,Student,类名大写字符开头,后面紧跟着(object),这表示这个类来自哪里,括号里面的object可以不写

  • 定义好了Student类,可以创建出Student的实例,创建实例通过类名+()现实:

          yang = Student()
    
  • 这时候可以自由的给一个实例绑定属性

          yang.name = 'yangaoteng'
          yang.score = 1000
    
  • 由于类有的时候会起到模板的作用,我们可以在创建实例的时候,把我们一些任务必须绑定的属性填写进去。我们可以通过一个特殊的 __ init __(前后个有两个_),在创建实例的时候,就可以把 name , score 等属性绑定上去:

          class Student():
              def __init__(self,name,score):
                  self.name = name
                  self.score = score
    
  • __ init __ 方法的第一个参数永远是self,self表示创建的实例本身

  • 有了__ init__ 方法,在创建实例的时候,就不能传入空的函数了,必须传入与__ init __ 方法匹配的参数,但self不需要传,Python解释器会自动上传进去。

          >>> yang = Student('yangaoteng',100)
          >>> yang.name
          ’yangaoteng‘
          >>> yang.score
          59
    
  • 做到这里我们就可以搞事情了,我们可以对数据进行分类,大于90分的成绩为’A‘....,进行男女的分类。等等,对数据进行处理

      # 创建一个实例,对男女进行分类,对‘成绩进行分类’
      class Student():
          def __init__(self,name,score,sex):
              self.name = name
              self.score = score
              self.sex = sex
          def Student_score(self):
              a='男'
              if self.sex =='男':
                  a= '男'
              elif self.sex == '女':
                  a= '女'        
              if self.score >=80:
                  print('姓名{0},性别{1},成绩A'.format(self.name,a))
    
              elif self.score >=60:
                  print('姓名{0},性别{1},成绩B'.format(self.name,a))
    
              elif self.score >=0:
                  print('姓名{0},性别{1},成绩C'.format(self.name,a))
              else:
                  print('666')
    

访问限制

  • 在class内部,有属性有方法有方法,外部代码可以直接调用实例变量的方法来进行操作,这样,就隐藏了内部的复杂逻辑。

  • 但是,从前面的Student类的定义看,外部代码还是可以自由的修改实际的namescore属性:

          >>> yang = Student('yangaoteng',100,'男')
          >>> yang.score
          100
          >>> yang.score=0
          >>> yang.score
          0
    
  • 这样我的成绩就被改变成了0分,显然是不可能的。如果想让内部属性不被外部访问,可以在属性名称前面加上两个下划线 __,在Python中,实例的变量如果以__开头,就是私有变量(private),只有内部可以访问,外部不可以访问。

          class Student(object):
          def __init__(self,name,score):
              self.__name = name
              self.__score = score
          def print_score(self):
              print('{0}:{1}'.format(self.__name,self.__score))
    
  • 改变完成之后,就无法通过外部访问了

          >>> yang = Student('yangaoteng',100,'男')
          >>> yang._name
          Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
          AttributeError: 'Student' object has no attribute '__name
    
  • 这样参数被隐藏了,我们无法在内部进行访问,我们就可以更好的处理数据。

          # 
          class Student():
              def __init__(self, name, score):
                  self.__name = name
                  self.__score = score
    
              def get_name(self):
                  return self.__name
    
              def get_score(self):
                  return self.__score
    
              def set_name(self,name):
                  self.__name = name
    
              def set_score(self,score):
                  if 0<=score<=100:
                      self.__score = score
                  else:
                      raise ValueError("数值不规范,请输入(0-100)的数字")
    
              def print_score(self):
                  print("{0}:{1}" % (self.__name, self.__score))
    
  • 注意错误写法:

          >>> yang =Student('yangaoteng',100,'男')
          >>> yang.get_name()
          'yangaoteng'
          >>> yang.__name = 'wangwenwen'
          >>> yang.__name 
          wangwenwen
    
  • 从表面看,外部代码成功设置了__name变量,但实际是这个__name变量和class内部的__name 不是一个变量!

          >>> yang.get_name()
          'yangaoteng'
    

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这