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