美文网首页
python面向对象(3):数据封装&访问限制

python面向对象(3):数据封装&访问限制

作者: _百草_ | 来源:发表于2020-04-09 17:50 被阅读0次
# -*- coding:utf-8 -*-
"""
@author:wlh
@file:dataEncapsulation_0408.py
@time:2020/04/08
"""
# 面向对象编程的第一个特点:数据封装
# 每个实例都有各自的name和score等属性;通过函数来访问这些数据


class Student3(object):
    def __init__(self, name, score):
        """通过定义__init__方法,在创建实例的时候,就把name等属性绑上去"""
        self.name = name  # 成员变量
        self.score = score

    def print_score(self):
        """
        不必从外部访问,可以直接在类的内部定义访问数据的函数;这样就把数据封装起来了
        如何打印,外部无需知道,直接调用就好
        封装数据的函数,即为类的方法
        """
        print('%s : %d : %s' % (self.name, self.score, self.get_grade()))
        # AttributeError: 'Student3' object has no attribute 'grade'
        # 修改:删除方法get_grade()内局部变量grade,选择直接调用该方法

    def get_grade(self):
        """封装优点2:增加新的方法"""
        if self.score >= 90:
            # grade = 'A'
            return 'A'
        elif self.score >= 60:
            # grade = 'B'
            return 'B'
        else:
            return 'C'


std = Student3('data', 80)
std.print_score()  # 直接调用

# --------------------访问限制------------------------------
# 成员变量、类变量、函数内部的局部变量


class Variable(object):
    classVa = 100  # 类变量
    __class = 'no'  # 不被外部调用

    def __init__(self, name):
        self.memVal = 'name'  # 成员变量 类的构造函数内,以self.X来定义
        self.menClass = self.__class * 2  # 类内部可以调用__开头的属性
        self.__name = name

    def men_function(self):
        funVal = {12: 34}   # 方法内变量,仅该方法内可以使用
        return

    def get_name(self):
        if len(self.__name) > 25:
            raise ValueError('long name!')
        return self.__name


inst = Variable('Lily Wang')  # 实例化
print(Variable.classVa)  # 类名调用类变量 100
print(inst.classVa)  # 实例调用类变量 100
'''
inst.classVa = 99  # 修改实例的类变量
print(inst.classVa)  # 实例调用类变量 99
print(Variable.classVa)  # 类名调用类变量 100

Variable.classVa = 98  # 修改类的类变量
print(inst.classVa)  # 实例调用类变量 99
print(Variable.classVa)  # 类名调用类变量 98
inst2 = Variable()
print(inst2.classVa)

# print(Variable.memVal)  # 类名调用成员变量 AttributeError: type object 'Variable' has no attribute 'memVal'
print(inst.memVal)  # 实例调用成员变量
'''
# 内部属性不被外部访问,可以把属性名前加上两个下划线
# 在python中,变量名若已__开头,则就变成私有变量(private),只有内部可以访问,外部不能访问
# 外部代码不能随意修改对象内部状态==>通过访问限制的保护,代码更加健壮
# print(inst.__class)  # 'Variable' object has no attribute '__class'
print(inst.menClass)  # 类内部可以调用

# 若是外部代码要获取name怎么办?可以给类添加get_name方法
print(inst.get_name())
'''
def get_score(self):
    return self.__name
'''

# 为何多定义一种方法? 因为在方法中,可以对参数做检查,避免传入无效的参数
'''
    def get_name(self):
        if len(self.__name) > 25:
            raise ValueError('long name!')
        return self.__name
'''

# __XXX__即以双下划线开头,且以双下划线结尾的变量,是特殊变量。特殊变量可以直接访问,不是private变量
# 双下划线的变量一定不能外部访问吗?
print(inst._Variable__name)  # access to a protected member;不建议使用

# 约定俗称的规定,一个下划线开头的变量,虽可以访问,但视为私有变量,不随意访问

inst.__name = 100  # 为类新增变量__score,但实际上与内部的__score不是一个变量
print(inst.__name)  # 输出:100
# 类内部的__name已被Python解释器自动改为 _Variable__name,而外部代码给 inst 新增了一个__name变量
print(inst.get_name())  # 输出:Lily Wang

相关文章

  • python面向对象(3):数据封装&访问限制

  • Python-学习之路-08 OOP -01

    OOP 面向对象 面向对象的特性封装封装就是对对象的成员进行访问限制封装的三个级别公开:public受保护的: p...

  • 1.2.03_C++ 类访问修饰符

    C++ 类 & 对象 数据封装是面向对象编程的一个重要特点,它防止函数直接访问类类型的内部成员。 类成员的访问限制...

  • python面向对象特性之封装

    面向对象——封装 一、概述 Python面向对象的三大特性:封装、继承和多态。 封装:在类中对数据的赋值、内部调用...

  • Python面向对象封装

    面向对象——封装 一、概述 Python面向对象的三大特性:封装、继承和多态。 封装:在类中对数据的赋值、内部调用...

  • Python GUI与面向对象

    Python GUI与面向对象 Python面向对象 对象是数据与其能实施的操作的封装结构 类是对于实例对象的抽象...

  • java day 6

    面向对象 1.面向对象的三大特征 封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算...

  • java 复习

    一、面向对象相关 1、面向对象三大特征 1、封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通...

  • Python -- 面向对象高级编程

    面向对象设计中最基础的3个概念:数据封装、继承和多态 使用_ slots _ _ slots _的作用:限制实例的...

  • 第八章:面向对象高级编程

    数据封装、继承和多态只是面向对象程序设计中最基础的3个概念。在Python中,面向对象还有很多高级特性,允许我们写...

网友评论

      本文标题:python面向对象(3):数据封装&访问限制

      本文链接:https://www.haomeiwen.com/subject/wefhmhtx.html