法
# 这是一个静态方法
既然静态方法和类方法都是跟对象无关的,都可以通过类来访问,那么他们有什么区别呢:
- 类方法在传参的时候,需要传入一个类,而静态方法在使用时不需要传入任何参数,可以直接通过类调用
- 类方法在传参的时候接收了一个参数,
cls
可以通过cls
访问类中的变量,而静态方法则不行,静态方法需要使用类名来访问(即使在类的内部也是如此)
四、类的成员-属性
属性其实就是通过?法改造过来的?种变量的写法, 在?法上添加?个@property就可以了
class Person:
def __init__(self):
pass
@property
def age(self):
return 1
p = Person()
age = p.age
print(age)
应?场景: 我们?般保存数据的时候, 不会保存?个?的年龄. 因为随着时间的推移. 每个?的年龄都时刻在改变着. 那如何保存更加完美呢? 很简单. 保存出?年??. 然后?程序来计算,你当前的年龄. 实时的. 那这个时候就需要进?相应的计算了. ?计算属于?个功能. 当然要写?法?了. 但是对于年龄这个属性??. 他应该是?个数值. ?不是动作. 所以python就提供了这样?种机制. 通过?法来描述?个属性.
注意:
- ?法参数只能有?个self
- ?法上?要写@property
- 调?的时候, 我们不需要写括号. 直接当成属性变量来?就可以了.
- 这种套路只能取值. 不能设置值
五、私有属性
在python的类中使用__xx
(以双下划线开头,不能以双下划线结尾)来定义一个私有属性,定义的私有属性一般(除去使用特殊的方法)是从外面获取不到的。
class Foo:
__c = 30 # 私有类变量
def __init__(self):
self.a = 10
self.__b = 20 # 私有的实例变量
def __func(self): # 私有方法也跟私有变量一样
print('私有方法')
f = Foo()
print(f.a) # 下面的都会报错
print(f.__b) # AttributeError: 'Foo' object has no attribute '__b'
print(Foo.__c) # AttributeError: type object 'Foo' has no attribute '__c'
f.__func() # AttributeError: 'Foo' object has no attribute '__func'