方法的动态性Python是动态语言,我们可以为类添加新的方法,也可以修改已有的方法。
[Python] 纯文本查看 复制代码 #方法的动态性
class Person:
def work(self):
print('努力工作')
def play_game(s):
print(s,"在玩游戏")
def work2(s):
print('好好上班,努力工作')
Person.play = play_game #增加方法
p =Person()
p.work()
p.play()
Person.work = work2 #修改函数内的方法
p.work()
运行结果:努力工作
<__main__.Person object at 0x000001CB5882EFD0> 在玩游戏
好好上班,努力工作
这里面包含了方法的增加和修改,注意work2的形参数量要大于等于work的形参数量,否则会报错。
私有属性与私有方法(实现封装)
要点:1、通常约定两个下划线开头的是私有属性,其他的为公共的。
2、类内部可以访问私有属性
3、类外部不能直接访问私有属性
4、类外部可以通过“_类名__私有属性(方法)名”来访问私有属性。
[Python] 纯文本查看 复制代码 class Employee:
def __init__(self,name,age):
self.name = name
self.__age = age #私有属性
def __work(self): #私有方法
print('好好工作,努力上班')
print(self.__age) #私有属性在类内部可以随意访问
e = Employee('cys',18)
print(e._Employee__age) #外部访问需要“_类名__私有属性名”访问
print(e.name)
e._Employee__work()
运行结果:18
cys
好好工作,努力上班
18
类变量同样可以私有,访问方法同私有属性和私有方法相同。
@property装饰器
@property装饰器可以将一个方法的调用方式变成是”属性调用“。
[Python] 纯文本查看 复制代码 #@property装饰器的最简化用法
class Employee:
@property
def salary(self):
return 30000
e = Employee()
print(e.salary)
运行结果为:30000
这就是一个@property装饰器的最简单的用法,像调用属性一样调用方法。
[Python] 纯文本查看 复制代码 class Employee:
def __init__(self,name,salary):
self.__name = name
self.__salary = salary
@property
def salary(self): #获取salary的值
return self.__salary
@salary.setter #表示针对salary属性的设置
def salary(self,s):
if 2000 < s < 50000:
self.__salary = s
else:
print('输入值有误,薪资应在2000-50000之间')
e = Employee('cys',5000)
print(e.salary)
e.salary = 20000 #使用装饰器后可以直接赋值
print(e.salary)
''' 没有用装饰器的情况下访问个修改私有属性
def get_salary(self): #获取salary的值
return self.__salary
def set_salary(self,s): #修改salary的值
if 2000<s<50000:
self.__salary = s
else:
print('输入值有误,薪资应在2000-50000之间')
e = Employee('cys',5000)
print(e.get_salary())
e.set_salary(20000)
print(e.get_salary())'''
运行结果为:5000
20000
这里面使用了装饰器和get、set方法两种方法进行了访问和修改操作,“@salary.setter”表示针对salary属性进行的修改,使用该装饰器后,修改salary属性的值便可以直接赋值修改了。 |