1

Day 26封装

一、封装

广义上的封装: 属于一个类的静态和动态属性,总是出现在一个类中. 

       使用的永远用类名或者对象名调用.

狭义上的封装:就是把变量和方法私有化,在类的外部以及子类中不能直接使用了 。

 

class A:
    STATIC ='aaa'#静态变量
    __S ='bbbb'#私有的静态变量
    def wahaha(self):
        print(A.__S)#_A__S 系统自动加了一个_A
print(A.STATIC)  #打印静态变量
print(A.__dict__) #以字典的形式打印出来
print(A._A__S)# 在类的外面调用是有的变量.
a= A()
a.wahaha()
A.__B=("ccc") #在类的外部添加一个静态变量.(此变量不是私有变量)
print(A.__dict__)
# 打印结果
# {'__module__': '__main__', 'STATIC': 'aaa', '_A__S': 'bbbb', 'wahaha': <function A.wahaha at 0x0058D6A8>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>,
'__doc__': None, '__B': 'ccc'}
 

 

私有类能够在内部随意调用,但不建议在外部调用

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__pwd
b= B('alex','alex1234')
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()# 通过open方法去调用内部私有方法.

私有的 静态变量  对象属性 动态方法

# 私有的变量  只能在类的内部定义和使用

#__变量 

#在类的外部使用私有静态变量_类名__私有变量名.

 

class D:
    __DDD ='ddd'  #_D__DD
    AAA='aaa'
class E(D):
    def qqxing(self):
        print(E.AAA)# 可以调用
        print(E.__DDD) #不可以调用

e =E()
e.qqxing()

#私有的名字 不能被子类继承.

 

java 

# private 私有的  -- __变量名 

#protect 保护的 --__N/A

#public 公共的 --正常的变量

 

# 房间类:所有人 价格 面积
class  Room :
    def __init__(self,owner,price,length,width,height):
        self.owner =owner
        self.__price_single =price #单价 ,私有对象属性
        self.__length  =length #私有对象属性
        self.__width =width #私有对象属性.
        self.height =height

    def get_area(self):
        return self.__length * self.__width
    def get_price(self):
        return self.__price_single * self.get_area()
alex =Room ('alex ',1000,2,1,0.3)
print(alex.get_area())
print(alex.get_price())
答案:
2
2000

 Property

#属性
property   #重要程度五颗星
classmethod #重要程度三颗星
staticmethod #重要程度一颗星
class Person:
    def __init__(self,name,height,weight):
        self.name =name
        self.__height =height
        self.__weight =weight
    @property #将一根方法伪装成属性
    def bmi(self):
        return self.__weight / (self.__height**2)
wang =Person('王子',1.77,69)
print(wang.bmi)

 

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)
# cig.change_discount(1)  #对象名调用方法 ②
# print(cig.price)

#类方法是被@classmethod装饰的特殊方法
#被装饰之后,方法默认接收一个 类 作为参数
# 之后所有的操作都只能和 类中的静态变量相关 而不应该和对象相关
# 类名 和 对象名 都可以直接调用类方法

staticmethod

 

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-09 15:12  萌哥-爱学习  阅读(232)  评论(0编辑  收藏  举报