zoukankan      html  css  js  c++  java
  • 类的封装

    class Regular(object):
        __discount = 1
        def __init__(self,name,price):
            self.name = name
            self.__price = price
        def __course(self):
            print('AAA')
    def course(person):        #即便你用  __course(person):类函数里这么写    _Regular__course(person):实际外部调用这么写
        return person.course() #都不可以这么用做归一化设计,因为这样你就暴露了,而course()根本不可能调用到
    
    alex = Regular('alex',100)
    print(alex.price) #真正获取方式是   alex._Regular__price
    print(alex.course()) #真正获取方式是  alex._Regular__course(person)
    print(Regular.discount) #真正回去方式是 _Regular__discount

    不想被别人看到  上面那么做就行了

    class Regular(object):
        __discount = 1
        def __init__(self,name,price):  
            self.name = name
            self.__price = price  加了双下划线的变量,只能在类的内部使用
        @property            #将一个函数伪装成属性
        def price(self):
            return self.__price
        @price.setter
        def price(self,value):     #改变这个变量  value是改变为的值
            self.__price = value
        @price.deleter
        def price(self):       #删除这个变量这么做
            del self.__price
    alex = Regular('alex',10000)
    print(alex.price)
    alex.price = 8
    print(alex.price)
    del alex.price
    print(alex.price)

    这下面的调用就都跟操作属性一样,这样就是做假操作,迷乱其他人的心智

    用属性代表函数上面那么做就好了,而且私有跟property一起用,但是那些函数都要同名

    class A(object):
        __discount = 100
        def __init__(self,name,price):
            self.name = name
            self.__price = price
    
        @classmethod
        def get_discount(cls):
            return cls.__discount
    
        @classmethod
        def change_discount(cls,value):
            cls.__discount = value
    
        @classmethod
        def del_discount(cls):
            del cls.__discount
    
    print(A.get_discount())
    A.change_discount(300)
    print(A.get_discount())
    A.del_discount()
    print(A.get_discount())

    因为我们在操作静态变量时候,不需要self,传它没用啊,所以上面用了一个classmethod的装饰器,将一个对象方法,变成类方法

        def func():    # 此时 func是一个静态方法
            print('既不操作和self相关的内容')
            print('也不操作和类名相关的内容')
    
    A.func()
    
    
    # login 登录
    
    class Student:
        def __init__(self,name):
            self.name = name
    
        @staticmethod
        def login():
            pass
    
    # 先获取这个学生的用户名和密码
    # 判断他登录成功之后进行实例化
    # Student.login()
    # stu = Student('alex')

    staticmethod

  • 相关阅读:
    block本质探寻五之atuto类型局部实例对象
    block本质探寻四之copy
    block本质探寻三之block类型
    Android Studio使用时遇见的一些问题+解决方法(持续更新)
    Android之练习MVVM+DataBinding框架模式
    解决 Mac Android Studio Gradle Sync 慢的问题
    Android之MVC、MVP、MVVM
    Android之同步与异步
    Android之Fragment
    Android之Fragment栈操作 commit()问题分析
  • 原文地址:https://www.cnblogs.com/CNHK1949/p/10623143.html
Copyright © 2011-2022 走看看