• 多态、封装


    # 广义上的封装
    # class 类名:
    # def 方法名(self):pass
    # 是为了只有这个类的对象才胡使用定义在类中的方法

    # 狭义上的封装: 把一个名字藏在类中

    class Goods:
    __discount = 0.2 # 私有的静态变量
    print(__discount) # 0.2

    # 在类的外部不能引用私有的静态变量
    # 类中的静态变量和方法名,在程序加载 的过程 中,已经执行完了,不需要等待调用
    # 在这个类加载完成 之前,Goods这个类名,还没见有出现在全局名称空间中
    # 私有的静态变量可以在类的内部使用,用来隐藏某个变量的值。

    print(Goods.__dict__) # {'__module__': '__main__', '_Goods__discount': 0.2, '__dict__': <attri

    class Goods:
    __discount = 0.7 # 私有的静态变量
    # 变形: _类名__私有变量

    # print(Goods.__discount) # AttributeError: type object 'Goods' has no attribute '__discount' 类对象没有这个属性
    print(Goods._Goods__discount) # 这样可以从类的外部访问,但是从编程规范的角度上出发,不建议在类的外部
    # 使用私有的静态变量


    class Student:
    def __init__(self,name,age):
    self.__name = name # 对象的私有变量,类外部,不能操作
    self.age = age
    def getName(self):
    return self.__name
    student = Student("王小宝",28)
    # print(student.__name) # 报错,对象没有这个属性
    print(student.getName()) # 王小宝 这是通过类中的方法,来操作对象的私有变量
    print(student.__dict__) # {'_Student__name': '王小宝', 'age': 28} 对象的属性,是存在对象的名称空间中的,并且对于
    # 对象的私有变量,也作了一个变形,以对象所属的直接类 _类名__私有变量

    print(student.age)
    student.age = "aaaa" # python是弱类型 语言
    print(student.age)

    class Goods:
    __discount = 0.6 # 私有的静态变量
    def __init__(self,name,price):
    self.name = name
    self.__price = price # 我不想让你看到这个值
    def getPrice(self):
    return self.__price * self.__discount
    def changePrice(self,newPrice): # 我想让你修改一个值的时候有一些限制
    if type(newPrice) is int:
    self.__price = newPrice
    else:
    print("本次价格修改不成功")
    pear = Goods("pear",89)
    print(pear.getPrice()) # 53.4
    pear.changePrice(100) # 将价格改为100
    print(pear.getPrice()) # 60.0

    class User:
    def __init__(self,username,password):
    self.username = username
    self.__pwd = password
    self.pwd = self.__getpwd()
    def __getpwd(self):
    return hash(self.__pwd)
    user = User("chirs",'jiayong')
    print(user.pwd) # -4615835297725458545

    # 类中的私有成员
    # 私有的静态变量
    # 私有的对象变量
    # 私有的方法
    # 私有的变量,在内存中存储时 会 变形,在使用时,也会变形
    # 为什么要定义一 个私有变量呢?
    # 不想让你看到这个变量
    # 不想让你修改这个变量
    # 想让你修改这个变量有一些限制
    # 有些方法或属性不希望被子类继承
    #

    # 广义上的封装,把属性和函数都放到类里
    # 狭义上的封装,定义 私有成员

    # 私有变量能不能 在类的外部 定义 ????
    class A:
    __private = 1000
    print(__private)
    def getAge(self):
    print(self.__age)
    print(A.__dict__) # {'__module__': '__main__', '_A__private': 1000, '__dict__': <attrib
    print(A._A__private) # 1000
    A.__language = "chinese"
    print(A.__dict__)
    A._A__age = 18 # 通过 这种方式,可以在外部定义一个私有的静态属性
    print(A.__dict__)
    print(A._A__age) # 18
    A.getAge(A) # 18

    # 私有变量能不能被继承???
    class A:
    age = 100
    __country = "china"
    def __init__(self,name):
    self.__name = name # 存储时 变形 _A__name
    class B(A):
    # print(age) # NameError: name 'age' is not defined
    # print(__country)
    def getName(self):
    return self.__name # _B__name

    b = B("jeason")
    print(b.__dict__)
    # b.getName() # AttributeError: 'B' object has no attribute '_B__name'

    # 结论: 对于 类中的私有变量 ,在那个类中,变量时,就是那个类的名字 和 下划线打头 : _类名__私有变量
  • 相关阅读:
    队列的顺序存储表示---数组实现
    栈的应用---用栈计算逆波兰表达式
    栈的应用--栈用作判断平衡符号,[()]对的,[(])错的
    栈ADT的数组实现
    栈ADT的链表实现
    链表的游标实现
    链表应用之基数排序
    多项式ADT的数组实现
    ListView13添加2
    计算器的简单编写,熟悉访问器,重载
  • 原文地址:https://www.cnblogs.com/chris-jia/p/9557751.html
Copyright © 2020-2023  润新知