9月20日学习内容整理:封装,私有属性方法,用装饰器描述的方法

补充:所有类的类型默认是type;对象名._ _dict_ _  把对象属性和对应的值组合成字典

封装:隐藏属性和实现细节,只对外公开访问方式

一、私有属性:

(1)实现:self._ _属性名  这样就设置成了私有属性

(2)只能在内部调用,在类外部是不能调用的

(3)若在外部添加双下划线的属性,这样是不会生效的,注意私有属性在外部定义是没有用的,只是添加了属性而已 

二、私有方法

(1)实现:def  _ _方法名(self)这样就设置成了私有方法

(2)只能在内部调用,外部不能调用

(3)注意在内部调用时只会调用自己的,若自己没有就会报错,不会去找父类的就算用super也会报错

(4)应用场景:定义的方法的返回值作为中间结果;父类的方法不希望子类调用

三、私有属性方法在python中如何不让外部调用

1、无论是双下划线方法名或是属性名,在python内部都是以  _类名_ _属性名或是方法名  这样的形式存在的,所以在外部调用双下划线时python内部是找不到的,所以外部没法调用,并且子类没有的话也找不到父类中重名的方法,因为类名不一样

2、如果非要在外部调用私有属性和方法,就用_类名_ _属性名或是方法名  去调用,但是尽量不要这么做

四、用装饰器描述的方法(通过python内部的函数)

1、property

(1)@property:将类中的方法伪装成属性,外部直接用.调用,不用加括号,但是在外部不能修改

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*self.__height)

jinghong = Person('景弘',1.8,94)
print(jinghong.name,jinghong.bmi)

(2)@方法名.setter    可以修改被伪装的属性

class Shop:
    discount = 0.75
    def __init__(self,name,price):
        self.name = name
        self.__price = price
    @property
    def price(self):
        return self.__price * Shop.discount
    @price.setter
    def price(self,new_price):
        self.__price = new_price

apple = Shop('apple',5)
print(apple.price)
apple.price = 6       #这样就进行了修改
print(apple.price)

(3)@方法名.deleter    可以删除被伪装的属性

class Foo:
    @property
    def AAA(self):
        print('get的时候运行我啊')

    @AAA.setter
    def AAA(self,value):
        print('set的时候运行我啊')

    @AAA.deleter
    def AAA(self):
        print('delete的时候运行我啊')

f1=Foo()
f1.AAA
f1.AAA='aaa'
del f1.AAA   #不会真正的删除,
f1.AAA       #还能正常调用

 

2、@staticmethod  静态方法

(1)什么时候用:完全使用面向对象编程,不能独立的放在类外面

         函数完全不需要依赖对象和属性,不能用类属性和对象属性

        没有必须要传的参数,但可以传自己需要的参数

3、@classmethod  类方法

(1)不能使用对象属性,但可以使用类属性

class Manager:

    @staticmethod    #静态方法
    def create_student(): pass

 

(2)必须传一个类cls,和不同方法必须传self一样

class A:
    role = 'a'
    @classmethod
    def class_method(cls):
        print(cls.role)

A.class_method()
A.role

 

转载于:https://www.cnblogs.com/wanghl1011/articles/7561942.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值