Python 中 方法的的参数没有声明类型 调用时确定参数的类型 参数的数量也可以由 可变参数控制。因此 Python 中是没有方法的重载的。定义一个方法即可有多种调用方式 相当于实现了其他语言中的方法的重载。
如果我们在类体中定义了多个重名的方法 只有最后一个方法有效。
方法的动态性Python 是动态语言 我们可以动态的为类添加新的方法 或者动态的修改类的已有的方法。
#测试方法的动态性
class Person:
def work(self):
print( 努力上班 )
def playgame(a):
print( {0}在玩游戏 .format(a))
def work2(a):
print( 好好工作 努力上班 )
Person.Play playgame #可以定义新的方法
p Person()
p.work() #结果 努力上班
p.Play() #等价于Person.Play(p)
#结果 __main__.Person object at 0x0000024BEBC20FD0 在玩游戏
Person.work work2 #还可以修改老的方法
p.work() #结果 好好工作 努力上班
私有私有属性和私有方法 实现封装
Python 对于类的成员没有严格的访问控制限制 这与其他面向对象语言有区别。关于私有 属性和私有方法 有如下要点
通常我们约定 两个下划线开头的属性是私有的(private)。其他为公共的(public)。类内部可以访问私有属性(方法)类外部不能直接访问私有属性(方法)类外部可以通过“_类名__私有属性(方法)名”访问私有属性(方法)方法本质上也是属性
#测试私有属性、私有方法 class Employee: __school NJUST #私有类属性 def __init__(self,name,age): self.name name self.__age age #age为私有属性 def __work(self): #私有方法 print( 好好工作 ) print( 年龄: ,self.__age) #类内部可以访问私有属性 print( 学校 ,Employee.__school) e Employee( Lee ,20) print(e.name) print(e._Employee__age) #访问私有属性的方法 因为私密属性就是以此名字保存 e._Employee__work() #调用私有方法 print(Employee._Employee__school)
结果
Lee 好好工作 年龄: 20 学校 NJUST NJUSTproperty 装饰器
property 可以将一个方法的调用方式变成“属性调用”。
property 主要用于帮助我们处理属性的读操作、写操作。
#简单测试 property的用法 class Employee: property def salary(self): print( salary running ) return 10000 emp1 Employee() print(emp1.salary) #结果 salary running # 10000
class Employee: def __init__(self,name,salary): self.__name name self.__salary salary def get_salary(self): return self.__salary def set_salary(self,salary): if 1000 salary 50000: self.__salary salary else: print( 录入错误 薪水应在1000~50000 ) emp1 Employee( Lee ,20000) print(emp1.get_salary()) #结果 20000 emp1.set_salary(30000) print(emp1.get_salary()) #结果 30000
property的实现比较复杂 我们先考察如何使用。把一个getter方法变成属性 只需要加上 property就可以了 此时 property本身又创建了另一个装饰器 score.setter 负责把一个setter方法变成属性赋值 于是 我们就拥有一个可控的属性操作
只定义getter方法 不定义setter方法就是一个只读属性
使用 property装饰器实现上功能
class Employee: def __init__(self,name,salary): self.__name name self.__salary salary property #相当于 salary 属性的 getter 方法 def salary(self): return self.__salary salary.setter def salary(self,salary): if 1000 salary 50000: #相当于 salary 属性的 setter 方法 self.__salary salary else: print( 录入错误 薪水应在1000~50000 )



