类中方法:对象方法、类方法、静态方法
1、对象方法:
a、直接声明在类中
b、自带参数self
c、通过对象调用
2、类方法
a、声明在@classmethod后面的函数就是类方法
b、自带参数cls
c、通过类来调用
3、静态方法
a、声明在@staticmethod后面的函数就是静态方法
b、没有自带参数
c、通过类调用
声明对象方法
class At:
num=100
def qt(self):
print(At.num)
print('abc')
q1=At() #创建对象
q1.qt() #调用对象方法
声明类方法
class At:
num=100
@classmethod
def at(cls):
print(cls.num) #cls指向当前类,跟self指向当前对象一样
print('abc')
At.at() #调用类方法
声明静态方法
class At:
num = 100
@staticmethod
def bt():
print(At.num)
print('abc')
At.bt() #调用静态方法
4、怎么选择使用哪种方法(重点!)
如果实现函数的功能需要用到对象属性,那么就把这个函数声明成对象方法;
如果实现函数的功能不需要用到对象属性,那么就可以选择静态方法和类方法;
在不使用对象属性的情况下,选用类方法
既不使用对象属性也不使用类,选用静态方法
5、私有化
类中的内容默认都是公开的(在类的外面也可以使用)
a、私有化—将类的内容在类的外面隐藏
在类中方法名或者属性名前加两个下划线,例如:__属性名
私有的方法和属性只能在类的内部使用,不能在类的外部使用
b、私有原理
Python中没有真正的私有化(没有从访问权限上去限制内容的访问)
私有的原理就是在私有的属性名或者方法名前加前缀“_类名”来阻止外部直接通过带两个下划线的名字去使用属性和方法
class Person:
num=21
def __init__(self,name,age):
self.name=name
self.__age=age
def show(self):
return self.__age
p1=Person('Wahaha',23)
print(p1.age) #AttributeError: 'Person' object has no attribute 'age'
print(p1._Person__age) #23 加“_类名”可查看私有化信息
print(p1.show())
6、getter和setter
a、什么时候需要添加对象属性的getter和setter
如果希望在通过 对象.属性 获取属性值之前,再干点别的事情,就可以给这个属性添加getter;
如果希望在通过 对象.属性 给属性赋值之前,再干点别的事情,就可以给这个属性添加setter;
b、怎么添加setter和getter
getter:
a、在属性名加_
b、添加属性对应的getter格式:
@property
def 属性名(去掉_)(self):
》》函数体——》会对属性值进行处理后,返回相应的结果(必须要有返回值)
c、使用属性值的时候,不通过带下划线的属性名去使用,而是通过没有下划线的属性去使用
注意:对象.不带下划线的属性 --> 调用getter对应的函数
setter:
a、如果想要添加setter,必须先添加getter
b、添加属性对应的setter格式:
@属性名(去掉_).setter
def getter名(self,参数):
》》函数体
》》self.属性名 = 处理后的值
class Person:
def __init__(self,week,value):
self._week=week
self._value=value
#week的getter
@property
def week(self): #getter名
if self._week==1:
return '周一'
elif self._week==2:
return '周二'
elif self._week==3:
return '周三'
elif self._week==4:
return '周四'
elif self._week==5:
return '周五'
elif self._week==6:
return '周六'
elif self._week==7:
return '周日'
else:
return ValueError
# isinstance(值,类)——》判断指定的值是否是指定类型(返回bool值)
@property
def value(self):
return self._value
@value.setter
def value(self,x):
if x<0:
self._value=0
elif x>9:
self._value=9
else:
self._value=x
p1=Person(1,6)
p2=Person(2,-8)
p3=Person(3,54)
print(p1.week) #实质是在调用week的方法,并获取返回值
p2.value=-32
print(p2.value)
p3.value=21
print(p3.value)