什么是封装?
广义上(大家认为的):
把一类事物的相同的行为和属性归到一个类中
狭义上(学术上的定论)
把一些特殊的属性和方法藏在类中
外部无法调用,只有内部可以调用
class Dog: dog_sum = 0 def __init__(self): self.count() # 从一个类的内部调用了count方法 def count(self): Dog.dog_sum += 1 alex = Dog() print(Dog.dog_sum) alex.count() # # 从一个类的外部调用了count方法 alex.count() alex.count() print(Dog.dog_sum)
隐藏静态属性class Dog:
class Dog:
# dog_sum = 0 # 不安全,因为这个属性可以在类的外部被随便修改
__dog_sum = 0 # 安全,通过dog_sum方法和__变量名让属性变成只能看不能改的值
def __init__(self):
self.count()
def count(self):
Dog.__dog_sum += 1 # 可以从一个类的内部使用__dog_sum的属性
def dog_sum(self):
return Dog.__dog_sum
print(Dog.__dict__)
alex = Dog()
print(Dog.__dict__)
# print(Dog.__dog_sum) # 不可以从外部直接使用这个变量
print(alex.dog_sum())
class Dog: __dog_sum = 0 # 私有的静态属性 _Dog__dog_sum def __init__(self): self.count() def dog_sum(self): return Dog.__dog_sum # 只要是在类的内部使用__名字,默认就被改成 _类名__名字 print(Dog.__dict__) print(Dog._Dog__dog_sum) # 绝不能在后续我们的代码中出现这种情况
只要是在类的内部的名字前面加上双下划线
那么这个名字 就变成 私有的 (只能在类的内部使用,不能在类的外部使用)
在定义的时候,存储的名字就会发生变化 _类名__名字
因此 在类的外部就不会被调用到了
在类的内部 使用__名字,默认就被改成 _类名__名字
class Dog: # dog_sum = 0 # 不安全,因为这个属性可以在类的外部被随便修改 __dog_sum = 0 # 安全,通过dog_sum方法和__变量名让属性变成只能看不能改的值 def __init__(self): self.__count() def __count(self): Dog.__dog_sum += 1 # 可以从一个类的内部使用__dog_sum的属性 def dog_sum(self): return Dog.__dog_sum alex = Dog() print(alex.dog_sum()) yuan = Dog() print(yuan.dog_sum())
class Dog: def __init__(self,name,password): self.__name = name # 不希望某个值被随便修改 self.__password = password # 不希望某个值被从类的外部看到 def login(self,usr,pwd): if usr == self.name and pwd == self.__password: return True def name(self): return self.__name def set_name(self,new_name): if type(new_name) is str: self.__name = new_name alex = Dog('alex','sb123') print(alex.login('alex','sb222')) print(alex.login('alex','sb123')) print(alex.name()) alex.set_name('alex_sb') print(alex.name())
只能在类的内部被调用,保证了类内部数据的安全,不会被别人随意修改
私有静态属性 : 为了不随意被外部修改
私有方法 : 不希望被外部随意调用
私有的对象属性 :
不希望某个值被随便修改
不希望某个值被从类的外部看到
封装在继承中的情况
子类不能继承父类的私有方法
class Foo(object): __私有的静态变量 = "ABC" #_Foo__私有的静态变量 print("---->",__私有的静态变量) #在类的内部使用 _Foo__私有的静态变量 class Son(Foo): pass print(Foo.__私有的静态变量) 报错