Python ---封装
广义的封装:把类和函数放到类里,公有的
狭义的封装:把一些变量和方法,隐藏起来不对外公开,私有的_名字(双下划线加名字)
class Person:
__conutry = '中国' #私有的静态属性
print(Person.__country) -->AttributeError: type object 'Person' has no attribute '__country'
结论:私有变量只能在类的内部使用,不能在类的外部被调用
如果非要在类的外部使用类的私有属性,需要Person._Person.__country,进行调用,但是一般不强行调用类的私有变量
在类的内部调用私有变量,__变量名的形式会发生变形----> _Person.__变量名,在属性的前面自动添加单下划线变量名
在类的外部不能定义一个私有变量
类的装饰器方法:classmethod,staticmethod,property
事例:
class Circle:
def __init__(self,r,p=3.14):
self.r = r
@property
deff area(self):
return p*self.r**2
# 方法一般都是动词,指某一类事物的动作或者技能,但是圆的面积是名词,但是计算数据又必须写方法,所以装饰器可以将函数伪装成一个属性,通过@property实现
c1 = Circle(3)
c1.area #添加@property在调用计算面积的方法时,不需要加括号,类似于调用类的属性,一个函数的砂上面添加property,在调用的时候就不需要添添加括号,否则会报错
@property方法的成对出现的方法
class Goods:
def __init__(self,price,discount):
self.__price = price
self.discount = discount
@property
def price(self):
return self.__price * self.discount
@price.setter #写这个方法的前提是,已经用property对属性进行装饰
def price(self,newprice):
self.__price = newprice
g = Goods(7,0.8)
print(g.price)
g.price = 10
print(g.price)
classmethod某一个类中的方法,并没有用到类的实例中的具体属性,而只是用到类的静态变量,就用类方法,调用的时候直接使用类名.方法名
class Person:
Country = '中国人'
@classmethod
def country(cls):
print('当前角色的国籍是%s'%cls.country)
Person.country
staticmethod 方法:如果一个方法既不会用到类的属性,也用不到实例化对象的属性,就应该定义一个静态方法,调用的时候直接 类名.方法名