方法的动态性
方法没有重载,定义多个同名方法时,只有最后一个有效
python是动态语言,可以动态为类添加新的方法,修改类已有的方法
私有属性和私有方法(实现封装)
测试私有属性,私有方法
#测试私有属性、私有方法
class Employee:
__company = "百战程序员"
def __init__(self,name,age):
self.name = name
self.__age = age #私有属性
def __work(self): #私有方法
print("好好工作,赚钱娶媳妇!")
print("年龄:{0}".format(self.__age))
print(Employee.__company)
e = Employee("高淇",18)
print(e.name)
#print(e.__age)
print(e._Employee__age)
print(dir(e))
e._Employee__work()
print(Employee._Employee__company)
访问私有属性,私有方法:
对象._类型__方法
对象._类型__属性
@property装饰器
将一个方法的调用转变成属性的调用
#@property装饰器的用法
class Employee:
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("录入错误!薪水在1000--50000这个范围")
'''
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("高淇",30000)
#print(emp1.get_salary())
#emp1.set_salary(2000)
#print(emp1.get_salary())
print(emp1.salary)
emp1.salary = 2000
print(emp1.salary)
面向对象三大特征
封装(隐藏):”细节封装起来“只对外暴露“相关调用方法”
继承:子类具有父类的特征,提高代码的重用性
支持多重继承,一个子类可以继承多个父类, 格式:
object是所有类的父类
子类重写,修改父类的方法
多态:同一个方法调用由于对象不同产生不同行为
object根类
dir()查看对象属性
重写__str__()方法
返回一个对于“对象的描述”
class Person: #默认继承object类
def __init__(self,name):
self.name = name
def __str__(self):
return "名字是:{0}".format(self.name)
p = Person("高淇")
print(p)
运行结果及加str后的结果
mro()
打印类的层次结构
#测试mro()方法解析顺序
class A:
def aa(self):
print("aa")
def say(self):
print("say AAA!")
class B:
def bb(self):
print("bb")
def say(self):
print("say BBB!")
class C(B,A):
def cc(self):
print("cc")
c = C()
print(C.mro()) #打印类的层次结构
c.say() #解释器寻找方法是“从左到右”的方式寻找,此时会执行B类中的say()
运行结果
super()获取父类的定义
A是B的父类,A.say(self) = super().say()
多态
同一个人吃饭,有的用手,有的用筷子,有的用刀叉
特殊方法和运算符重载
每个运算符对应相应的方法
特殊方法统计如下
特殊属性
设计模式——工厂模式
实现创造者和调用者的分离
设计模式——单例模式
确保一个类只有一个实例,并提供一个访问该实例的全局访问点