封装
python :public 公有的 private 私有的
java完全面向对象的语言 public 公有的 protect 保护的 private 私有的
定义一个私有的名字:就是在私有的名字前面加上两条下划线 __N = "aaa"
所谓私有就是不能在类的外面去引用它
1 class A: 2 __N = 'aaaa' #定义一个私有变量 3 def func(self) 4 print(A.__N) #在内部引用 5 a = A() 6 a.func() #这样才可以在外部打印出全局变量 7 print(A._A__N) #python就是把__名字当成私有变量来定义
一个私有的属性/名字,在存储的过程中任然会出现在A.__dict__中,所以我们还可以调用的到
只不过python对其名字 进行了修改:_类名__名字
只不过在类的外部调用需要“_类名__名字”去使用
在类的内部可以正常使用名字
在类内只要代码遇到双下滑线名字,就会被python解释器自动的转化成 _类名__名字 的方式
私有属性
1 class B(object): 2 def __init__(self,name): 3 self.__name = name 4 def func(self): 5 print("in func:%s" %self.__name) 6 7 b = B() 8 print(b._B__name) 9 b.func()
私有方法
1 class C: 2 def __func(self): 3 c = C() 4 c._f__func()
在类中,静态属性,方法,对象属性都可以变成私有的,需要在这些名字之前加上__
1 class D: 2 def __func(self): 3 print("in func") #"_D__func()" 4 class E(D): 5 def __init__(self): 6 self.__func() #‘_E__func()’ 7 8 e = E()#__func不能被调用 9 #私有的名字不能被子类继承 10 11 class F: 12 def __init__(self): 13 self.__func() 14 def __func(self): 15 print("in func F") 16 class G(F): 17 def __func(self): 18 print("in func G") 19 20 g = G() 21 输出结果:in func F
私有的名字在类内中使用的时候,就是会变成_该类名__方法名
以此为例,没有双下划线会先找E中的__func
但是有了双下划线,会在调用这个名字的类D中直接找_D__func
1 class F:pass 2 F.__name = "kuoiea" 3 print(F.__name) 4 5 输出内容为:kuoiea 6 #变形只会在在类的内部发生不会在类的外部发生
于Java中的对比:
public 公有的 在类的内部可以使用,子类可以使用,外部可以使用 python中所有正常的名字
protect 保护的 在类的内部可以调用,子类可以使用,外部不可以使用 python中没有
private 私有的 只能在类的内部使用,子类的外部都不可以使用 python中的 __名字
私有的用法:
当一个方法不想被子类继承的时候
当有些属性或方法不希望从外部被调用,只想提供给内部的方法使用
property:是一种特殊的属性,访问它时就会执行一段功能(函数)然后返回值。
1 class Foo(object): 2 @property 3 def func(self): 4 print("hello") 5 6 f = Foo() 7 f.func 8 这样可以像调用一个对象一样,也可以调用这个方法
将一个方法伪装成一个属性: 这样并不会让你的代码上有什么逻辑上的提高 只是从调用者的角度上换了一种方式,使之看起来更合理
@func.setter--->func 对伪装的属性进行赋值的时候调用这个方法,一般情况下用来修改
1 class Googs(object): 2 def __init__(self,name,price,discount): 3 self.name = name 4 self.__price = price 5 self.__discount = discount 6 @propetry 7 def discount_price(self): 8 return self.__price *self.__discount 9 10 @discount_price.setter 11 def discount_price(self,new_price): 12 self.__price = new_price 13 14 15 16 g = Googs("裤子",2000,0.8) 17 g.discount_price = 500 #这块调用的说discount_price.setter这块的代码,给self.__price重新进行赋值 18 print(g.discount_price) #这里调用的是@property之下的代码,执行运算操作
@func.deleter--->func 需要对伪装的属性进行删除操作的时候调用这个方法,一般情况下用来删除
1 class A(object): 2 @property 3 def name(self): 4 print("A") 5 @name.deleter 6 def name(self): 7 print("被删除了") 8 9 10 a = A() 11 del a.name #如果我们不给函数加上装饰器@name.deleter,那么del方法是不能对这个函数进行删除的,只有我们对这个方法加上装饰器,del方法才会有作用
将一些需要随着一部分属性的变化而变化的值的计算过程 从方法伪装成属性
将私有的属性保护起来,让修改的部分保护起来,让修改的部分增加一些约束,来提高程序的稳定性和数据的安全性
#classmethod
class A(object): __N = 11 @classmethod def n(self): self.__N = 12 return self.__N print(A.n())#如果不加上@classmethod这个装饰器的话,类是不能直接调用这个函数,来对__N改名的
类方法,可以直接被类调用 不需要默认传对象参数 只需要传一个参数就可以
#staticmethod
当一个方法要使用对象的属性时,就使用普通的方法当一个方法要使用类中的静态属性时,就使用类的方法当一个方法即不使用对象的属性也不使用类中的静态属性时,就可以使用staticmethod静态方法

浙公网安备 33010602011771号