面向对象之封装

在什么场景下需要封装

1.隐藏一个属性 不让类外部调用
2.保护中国属性 不让被随意修改
3.保护属性不被子类继承

class Person():
    def __init__(self,name,age):
        self.name = name
        self.__age = age    #定义为私有属性
    def get_age(self):
        return self.__age

p = Person('judy',18)
# print(p.__age)  #此处报错,不可以直接调用私有属性
print(p.get_age())

与封装有关的三个内置方法

property

class Person():
    def __init__(self,name,age):
        self.name = name
        self.__age = age    #定义为私有属性
    @property   #把一个方法伪装成一个属性,不能有self之外不能有其他的参数。调用时 直接调用函数名,不用加()
    def age(self):
        return self.__age
    @age.setter     #给属性设置值
    def age(self,age):
        self.__age = age
    @age.deleter    #删除私有属性age
    def age(self):
        del self.__age
p = Person('judy',18)
p.age = 16  #给私有属性age赋值
print(p.age)    #查看私有属性age
del p.age   #删除私有属性age
property

classmethod:  把一个方法变成类方法,不需要实例化对象,通过类名就可以访问类属性和类方法

class Goods():
    __discount = 0.6
    def __init__(self,name,price):
        self.__name = name
        self.__price = price
    #定义一个方法修改打折
    @classmethod
    def change_disc(cls,new):
        cls.__discount = new
Goods.change_disc

staticmethod :   不需要实例化对象可以直接调用# 完全面向对象的程序中,如果一个函数既和对象 没关系,又和属性没有关系 就用静态方法

class Person():
    def __init__(self,name,password):
        self.name = name
        self.password = password
    @staticmethod
    def login():
        print('input your name and password')
Person.login()

 

posted on 2018-09-08 22:13  蒋丞丞  阅读(130)  评论(0编辑  收藏  举报