python面向对象(封装)

一. 封装

  隐藏对象的属性和实现细节,仅对外提供公共访问方式。

好处 :

1. 将变化隔离; 

2. 便于使用;

3. 提高复用性; 

4. 提高安全性;

封装原则:

      1. 将不需要对外提供的内容都隐藏起来;

      2. 把属性都隐藏,提供公共方法对其访问。

私有变量和私有方法:

私有变量:在python中用双下划线开头的方式将属性隐藏起来(设置成私有的)

私有方法:在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的

class A:
    STATIC = 'aaa'  # 静态变量
    __S = 'bbb'     # 私有的静态变量
    def wahaha(self):
        print(A.__S) # _A__S
print(A.STATIC)
print(A.__dict__)
print(A._A__S)      # 在类的外面调用私有的变量
a = A()
a.wahaha()
A.__B = 'ccc'   #在类的外部添加了一个静态变量
print(A.__dict__)  #我们不能在一个类的外部创建一个"私有的"变量
print(A.__B)

class B:
    def __init__(self,name,pwd):
        self.name = name
        self.__pwd = pwd   # 也可以创建对象的私有属性

    def qqxing(self):
        self.__a = 'A'     # _B__a

    def get_pwd(self):
        print(self.__pwd)
b = B('alex','alex3714')
b.qqxing()

print(b.name)
print(b._B__pwd)  # 当在类外部的时候,我们也不能直接使用对象的私有属性
b.get_pwd()

class C:
    def __ppt(self):    # 私有的方法
        print('ppt')
        self.age = 83
    def open(self):
        self.__ppt()
        print('打开文件')
c = C()
c._C__ppt()   # 不能直接调用
c.open()
c.name = 'alex'
print()
私有de 静态变量 对象属性 方法
    私有的 只能在类的内部定义和使用
    __名字
    在类外部使用私有静态变量 _类名__私有的名字
    私有的名字 不能被子类继承
class D:
    __DDD = 'ddd'     # _D__DDD
    AAA = 'aaa'

class E(D):
    def qqxing(self):
        print(E.AAA)   #E._E__DDD

e = E()
e.qqxing()
封装

二. property

将一个方法伪装成属性

class Foo:
    def __init__(self,name):
        self.__name = name
    @property
    def name(self):
        return self.__name
    @name.setter
    def name(self,new_name):
        if type(new_name) == str:
            self.__name = new_name
    @name.deleter
    def name(self):
        del self.__name

alex = Foo('alex')
del alex.name
print(alex.name)

三. classmethod

讲一个普通方法装饰为一个类方法

class Goods:
    __discount = 0.8
    def  __init__(self,name,price):
        self.name = name
        self.__price = price

    @property
    def price(self):
        return self.__price*Goods.__discount

    @classmethod  #讲一个普通方法装饰为一个类方法
    def change_discount(cls,new_dis):  # 类方法
        cls.__discount = new_dis
Goods.change_discount(1)
cig = Goods('cigrette',20)
print(cig.price)
cig.change_discount(0.2)
print(cig.price)

四. staticmethod 

装饰一个不需要self参数 也不需要cls参数的函数,即当做普通函数执行

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

    @staticmethod    #装饰一个不需要self参数 也不需要cls参数的函数
    def login(a,b,c):    # 普通的函数
        usr = input('username>>>')
        pwd = input('password>>>')
        if usr == 'alex' and pwd == '123':
            obj = Student(usr)
            return obj
# 学生 login
# 用户名  密码  属性
ret = Student.login(1,2,3)
print(ret)

 

posted @ 2018-03-11 16:35  忆殇★伤忆  阅读(144)  评论(0编辑  收藏  举报