1.对象方法、类方法、静态方法
1.对象方法:
a. 直接声明在类中
b. 自带参数self
c. 通过对象来调用
2.类方法:
a. 将函数声明在 @classmethod 后面。就是类方法
b. 自带参数cls。 调用不用传参,系统会自动将调用这个方法的类 赋给它
c. 类方法要通过类来调用
3.静态方法:
a. 声明在 @staticmethod 后面的函数就是静态方法
b. 没有自带的参数
c. 通过类来调用
4.怎么选择使用哪种方法(重点!):
对象方法:如果实现函数的功能需要用到对象的属性,那么就把这个函数声明成对象方法
静态方法和类方法:实现函数的功能不需要用到对象的属性,就可以选择使用静态方法或者类方法
类方法:在不使用对象属性的前提下,需要使用类,就用类方法
静态方法: 既不需要对象的属性,也不需要类 ,就用静态方法
class Person:
# 声明一个类方法
num =61
@classmethod
def destroy(cls):
#cls 指向的是当前类,调用这个方法的类可以做的事情cls都可以做
# .和对象方法中的self对应的对象一样
print('cls:',cls,cls.num)
p2 = cls()
print('人类破坏环境')
# 声明一个静态方法
@staticmethod
def func1():
print(Person.num)
p3 = Person()
print(p3)
print('人类的静态方法')
Person.destroy()
Person.func1()
2.私有化
类中的内容默认都是公开的(在类的外面可以使用)
- 私有化 -- >将类的内容在类的外面隐藏不能直接用。
在类中方法名或者属性名前加两个下划线 __
私有的方法和属性只能在类的内部使用,只能在类的外部使用
2.私有的原理
python中没有真正的私有化(没有从访问权限上去限制内容的访问)
私有的原理就是在私有的属性名或者方法名前加前缀'_类名 来阻止外部
通过带两个下划线的名字去使用属性和方法
class Person:
def __init__(self,name,age):
self.name = name
#私有对象属性两个下划线
self.__age = age
def show_age(self):
print(self.age)
self.func2()
#私有对象方法
def __func2(self):
print(self.age)
p1 = Person('xiaoming',23)
#print(p1.age)
#p1.func2()
p1.show_age()
p1._Person__age
3.getter和setter
1.什么时候需要添加对象属性的getter和setter
如果希望在通过 对象.属性 获取属性的值之前,在干点别的事情,就可以给这个属性添加getter
如果希望在通过 对象.属性 给属性赋值之前,在干点别的事,就可以给这个属性添加setter
2.怎么添加setter和getter
getter
a. 属性名前加一个下划线 属性名
b.添加属性对应的getter
@property
def 属性名去掉(self):
函数体--> 会对属性的值进行处理后返回相应的结果,函数体必须要有返回值
c. 使用属性的值的时候不通过带下划线的属性名去使用,而是通过没有下划线的属性名取使用。
注意:对象.不带下划线的属性名,实际上就是在调用getter后声明的函数
a.添加setter
如果想要添加setter必须要先添加了getter
@getter.setter
def 属性名去掉_(self,参数): #除了默认值self必须再传一个参数
作别的事情
self.属性名 = 处理后的值
#年龄的值要在0-150之间,超出就报错,获取值的时候返回年龄值,并且返回这个年龄对应的阶段
class Person:
# def __init__(self,name,age):
# self.name = name
# self._age = age
def __init__(self):# 这里是不是要先确定属性的值。不能等传参。
self.name =0 #
self._age = 0
@property
def age(self):
if 0 <= self._age<=17:
return '未成年'
elif 18<=self._age<= 30:
return '青年'
elif 31<=self._age <= 50:
return '中年'
elif 51 <= self._age<= 80:
return '暮年'
else:
return '老年'
@age.setter
def age(self,a):
if not 0<= a <=150:
raise ValueError
self._age = a
p1 = Person()
p1.age=9
print(p1.age) #这里的p1.age是获取值,所以调用的是getter对应的age函数。
p1.age = 99 # 这个p1.age 是对age赋值,所以调用的是sttter对应的age函数。这里相当于给age函数的a传参99
print(p1.age)