Python面向对象编程--01 --(Python opp知识整理)

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

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

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

Python面向对象编程--01

面向对象的概念

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

  • 在Python中,全部数据类型均可以视为对象,固然也能够自定义对象。自定义对象的数据类型就是面向对象中类(Class)的概念spa

  • 假如咱们打印学生的成绩表设计

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

      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,而后才能把成绩打印出来:orm

    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()
  • 小结:get

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

类和实例

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

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

    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'
相关文章
相关标签/搜索