首页 > 编程语言 > 详细

python-36-封装与property

时间:2020-03-18 22:21:16      阅读:67      评论:0      收藏:0      [点我收藏+]

前言

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

面向对象函数: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 !!!

python-36-封装与property

原文:https://www.cnblogs.com/gsxl/p/12500456.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!