cccyyys 发表于 2021-6-26 14:39

【笔记】方法的动态性、私有属性与方法、@property装饰器、get和set方法

方法的动态性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、类外部可以通过“_类名__私有属性(方法)名”来访问私有属性。
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装饰器可以将一个方法的调用方式变成是”属性调用“。
#@property装饰器的最简化用法
class Employee:
    @property
    def salary(self):
      return 30000

e = Employee()
print(e.salary)
运行结果为:30000
这就是一个@property装饰器的最简单的用法,像调用属性一样调用方法。
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属性的值便可以直接赋值修改了。

源啊呢哈 发表于 2021-6-26 19:21

cccyyys 发表于 2021-6-26 21:35

源啊呢哈 发表于 2021-6-26 19:21
加油,小伙子

谢谢鼓励,哈哈哈
页: [1]
查看完整版本: 【笔记】方法的动态性、私有属性与方法、@property装饰器、get和set方法