zoukankan      html  css  js  c++  java
  • Python面向对象编程

    class Student(object):
    
        def __init__(self, name, score):
            self.name = name
            self.score = score

    注意到__init__方法的第一个参数永远是self,表示创建的实例本身,
    因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。
    有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,
    self不需要传,Python解释器自己会把实例变量传进去:
    >>> bart = Student('Bart Simpson', 59)
    >>> bart.name
    'Bart Simpson'
    >>> bart.score
    59

    数据封装

    class Student(object):
    
        def __init__(self, name, score):
            self.name = name
            self.score = score
    
        def print_score(self):
            print('%s: %s' % (self.name, self.score))

    可以直接在Student类的内部定义访问数据的函数,这样,就把“数据”给封装起来了。这些封装数据的函数是和Student类本身是关联起来的,我们称之为类的方法:
    
    
    >>> bart.print_score()
    Bart Simpson: 59
    这样一来,我们从外部看Student类,就只需要知道,创建实例需要给出namescore,而如何打印,
    都是在Student类的内部定义的,这些数据和逻辑被“封装”起来了,
    调用很容易,但却不用知道内部实现的细节
    -----------------------------------------------------------------------------------------
    访问限制
    如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,
    实例的变量名如果以__开头,
    就变成了一个私有变量(private),只有内部可以访问,
    外部不能访问,所以,我们把Student类改一改:
    class Student(object):
    
        def __init__(self, name, score):
            self.__name = name
            self.__score = score
    
        def print_score(self):
            print('%s: %s' % (self.__name, self.__score))
    
    
    >>> bart = Student('Bart Simpson', 59)
    >>> bart.__name
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'Student' object has no attribute '__name'


    但是如果外部代码要获取name和score怎么办?可以给Student类增加get_nameget_score这样的方法:
    
    
    class Student(object):
        ...
    
        def get_name(self):
            return self.__name
    
        def get_score(self):
            return self.__score

    如果又要允许外部代码修改score怎么办?可以再给Student类增加set_score方法:
    
    
    class Student(object):
        ...
    
        def set_score(self, score):
            self.__score = score
     
  • 相关阅读:
    Leetcode264. Ugly Number II丑数2
    Leetcode221. Maximal Square最大正方形
    223. Rectangle Area
    Leetcode216. Combination Sum III组合总数3
    Leetcode200. Number of Islands岛屿的个数
    Leetcode199. Binary Tree Right Side View二叉树的右视图
    Leetcode179. Largest Number最大数
    从零开始学Linux系统(二)之基本操作指令
    从零开始学Linux系统(四)之Vi/Vim操作指令
    MySQL基础原创笔记(二)
  • 原文地址:https://www.cnblogs.com/fkkk/p/9046732.html
Copyright © 2011-2022 走看看