python方法没有重载
在其他语言中,可以定义多个相同名称的方法,只要参数个数,类型不同即可
python中不存在方法的重载,多个重名方法。只有最后一个有效
方法的动态性
python是动态语音,可以动态的添加新的方法或者修改类的已有的方法
# 測試方法的動態性
class Person:
def work(self):
print("work hard!")
def play_game(s):
print("{0} playing games".format(s))
def work2(s):
print("work well")
Person.play = play_game # 动态在类中创建了方法
Person.work = work2 #修改了类中的work方法
p = Person()
p.work()
p.play() # 传入了p
私有属性和私有方法(封装)
python对于类中的成员没有严格的访问控制限制。这与其他面向对象语言有区别,关于私有属性和私有方法
1 按照约定,两个下划线开头的属性是私有的,其他为公共的
2 类内部可以访问私有属性
3 类外部不能直接访问私有属性
4 类外部可以通过 “_类名_私有属性、方法名”访问
方法本质上也是属性
# 测试私有属性
# 测试私有属性
class Employee:
__company = "BAT" #私有的类属性
def __init__(self, name, age):
self.name = name
self.__age = age # 定义为私有属性
def __work(self): # 私有方法
print("work hard")
print("age is {0}".format(self.__age)) # 私有属性类内部可以调用
print("company is {0}".format(self.__company))
e = Employee("LiMing", 58)
print(e.name)
# print(e.age) # 访问报错
print(e._Employee__age) # 成功输出
# e.work() # 访问报错
e._Employee__work()
print(e._Employee__company)
@property装饰器
可以将一个方法的调用方式变成属性调用
# 测试@property
class Employee:
@property
def salary(self):
print("pring 1000")
return 10000
e = Employee()
# e.salary() #加上@property 此调用报错
print(e.salary)
e.salary = 20000 # 不能设置值
限制类中的属性赋值:
class Employee:
def __init__(self, name, salary):
self.name = name
self.salary = salary
e = Employee("LiMing", 100000)
print(e.salary)
e.salary = -20000 # 不符合实际,但是代码中对赋值没有进行限制
print(e.salary)
对属性赋值进行限制
#1 属性私有
#2 第一种方法:增加set get 方法;第 二中方法:使用@property装饰器
class NewEmployee:
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("薪资设置不合理")
e = NewEmployee("LiMing", 100000)
print(e.get_salary()) # 使用get获取
e.set_salary(-200) # 使用set赋值
print(e.get_salary())
# 使用@propery 实现
class NewEmployee1:
def __init__(self, name, salary):
self.__name = name
self.__salary = salary
@property
def salary(self):
return self.__salary
@salary.setter
def salary(self, salary):
if 1000 < salary < 50000:
self.__salary = salary
else:
print("薪资设置不合理")
e = NewEmployee1("LiMing", 100000)
print(e.salary) # 获取值
e.salary = -2000 # 赋值
print(e.salary)