• python-36-封装与面向对象函数


    前言

    封装,前篇简单了解了封装,然后私有方法、私有属性,还可以有私有属性对外部的约束这篇将会简单介绍。

    面向对象函数:property、classmethod、staticmethod

    一、封装

    1、私有方法属性的约束,只能是字符串且非纯字符串的全数字

    # 1、私有方法属性的约束,newName 只能是字符串且非纯字符串的全数字
    class Login:
        def __init__(self, name, pwd):
            self.__name = name
            self.__pwd = pwd
        def get_name(self):
            return self.__name
    
        def set_name(self, newName):
            '''约束属性:newName,字符串且非纯字符串的数字'''
            if type(newName) is str and newName.isdigit() == False:
                self.__name = newName
            else:print('输入的类型有误,请重新输入!')
    
    if __name__ == '__main__':
        r = Login('广深小龙', 123)
        print(r.get_name())
        r.set_name('小龙龙')
        print(r.get_name()

     

     2、父类的私有属性,也不能被子类调用:

    So 私有属性只能在本身类中调用。

    # 2、父类的私有属性也不能被子类调用
    class A:
        __pwd = 666
    
    class B(A):
        print(A.__pwd)
    
    # 没实例化运行都直接报错

     总结:

    • 1.隐藏起一个属性 不想让类的外部调用
    • 2.我想保护这个属性,不想让属性随意被改变
    • 3.我想保护这个属性,不被子类继承

    二、面向对象函数

     ①property内置装饰器函数,只能对面向对象中使用,可对函数的 私有属性进行删改

    1、property:装饰该方法,方法伪装成为一个属性,少写了一个括号:

    # 1、property:装饰该方法,方法伪装成为一个属性,少写了一个括号
    class A:
        def __init__(self, num):
            self.__num = num
        @property               # 装饰该方法,方法伪装成为一个属性
        def square(self):
            return self.__num*self.__num
    
    r = A(-2)
    print(r.square)            # 实例化调用方法就不用加括号:r.square,方便将它传入下一个

    2、setter:对对象的修改,两个函数名参数要一样,@property,@函数.setter

    # 2、setter:对对象的修改,两个函数名参数要一样,@property,@函数.setter
    class A:
        def __init__(self,name):
            self.__name = name
        @property                    # 装饰该方法
        def f_name(self):
            return '非主流-'+self.__name
        @f_name.setter
        def f_name(self, newName):
            self.__name = newName
    
    r = A('广深小龙')
    print(r.f_name)
    r.f_name = '小龙女'
    print(r.f_name)

     3、deleter:property装饰器函数,属性删除

    property装饰器,借助公有的del关键字,进行删除。

    # 3、deleter:property装饰器函数,属性删除
    class A:
        def __init__(self, name):
            self.__name = name
        @property
        def name(self):
            return self.__name
        @name.deleter
        def name(self):
            del self.name
    
    r = A('广深小龙')
    print(r.name)
    del r.name
    print(r.name)

    ②classmethod:类方法,类能直接调用,不需要实例化

    1、类方法,cls是默认参数:

    只涉及静态属性的时候,就应使用这个classmethod装饰该方法

    # 1、classmethod:类方法,cls是默认参数
    # 只涉及静态属性的时候,就应使用这个classmethod装饰该方法
    class Goods:
        discount = 0.5
        def __init__(self, name, price):
            self.name = name
            self.__price = price
        @property
        def prices(self):
            return self.__price*self.discount
    
        @classmethod    # 装饰后不需实例化,直接能操作
        def update(cls, Newdiscount):
            cls.discount = Newdiscount
    
    r = Goods.update(2)     # classmethod装饰后不用传对象
    res = Goods('雪梨', 6)
    print(res.prices)

    ③staticmethod:静态方法

    1、静态方法,没有默认参数,像个函数一样:

    # 1、staticmethod:静态方法
    class Login:
        def __init__(self, usr, pwd):
            self.usr = usr
            self.pwd = pwd
        def login(self):
            return '登录成功!!!'
    
        @staticmethod
        def usr_pwd():   # 静态方法,没有默认参数,像个函数一样
            usr = input('请输入您的账号:')
            pwd = input('请输入您的密码:')
            return Login(usr, pwd)
    r = Login.usr_pwd()
    print(r.login())

    欢迎来大家QQ交流群一起学习:482713805 !!!

  • 相关阅读:
    紫书 习题2-4 子序列的和
    紫书 习题2-3 倒三角形
    HDU 1013 Digital Roots(字符串,大数,九余数定理)
    HDU 1308 What Day Is It?(模拟,日期)
    ACM数论-欧几里得与拓展欧几里得算法
    今日计划
    UVA 10340 All in All(字符串,朴素匹配)
    ACM-字符串
    Codeforces Round #424 B. Keyboard Layouts(字符串,匹配,map)
    Codeforces Round #424 A(模拟)
  • 原文地址:https://www.cnblogs.com/gsxl/p/12500456.html
Copyright © 2020-2023  润新知