目录
方法没有重载
如果定义多个方法是重名的,只有最后一个有效,前面的全部被覆盖
方法的动态性
python是动态语言
问题:如何给play_game()函数传参?
class Person:
def work(self):
print("努力上班")
def play_game(s):
print("{0}在玩游戏".format(s))
def work2(s):
print("努力上班")
Person.work=work2
Person.play=play_game
p=Person()
p.work()
p.play()
私有属性私有方法(实现封装)
1.两个下划线开头的就是 私有的
2.类内部可以访问私有方法和私有属性
3.外部不能直接访问私有属性私有方法
4._类名__私有属性名 可以访问私有属性
私有属性与私有调用方法测试
class Employee:
__company="aaaa"
def __init__(self,name,age):
self.name = name
self.__age = age
def __work(self):
print("haohaogzuo")
print("{0}岁".format(self.__age))# 类内部直接调用
print(Employee.__company)# 类内部直接调用
e=Employee("dd",18)
e._Employee__work()
print(e.name)
print(e._Employee__age)# 类外部用特殊方法调用
print(dir(e))
print(e._Employee__company)# 类外部用特殊方法调用
@property装饰器
可以将一个方法的调用变成“属性调用”,服务 getter和setter方法
class Employee:
def __init__(self,name,age):
self.name = name
self.__age = age
@property
def salary(self):
print("salary")
return 10000
e=Employee("dd",18)
print(e.salary)
原始方法
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")
e=Employee("dd",1000)
e.set_salary(20)
print(e.get_salary())
用@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")
e=Employee("dd",1000)
e.salary=-100
print(e.salary)
面向对象三大特征 封装 继承 多态
继承
一个子类可以直接继承多个父类,不指定则默认父类是object类
class Employee:
def __init__(self,name,salary):
self.name = name
self.__salary = salary
def salary(self):
print("普通方法")
def __sat(self):
print("私有方法")
class Student(Employee):
def __init__(self,name,salary,score): # 父类的属性 子类需要初始化继承
Employee.__init__(self,name,salary) #调父类的构造器,必须显示不然不会被调用
self.score = score
pass
print(Student.mro()) # mro()函数 打印类的层次
s=Student("gao",3000,30)
s.salary() # 父类的方法 子类可以直接调用
print(s.name)
print(s._Employee__salary) # 对于父类的私有属性和私有方法需要按照特定格式调用
s._Employee__sat()
print(dir(s)) # 用来查对象所有的属性
方法的重写
子类继承父类方法后,可以对方法进行重写,相当于覆盖,用于改造方法
class Employee:
def __init__(self,name,salary):
self.name = name
self.__salary = salary
def salary(self):
print("普通方法")
def __sat(self):
print("私有方法")
class Student(Employee):
def __init__(self,name,salary,score): # 父类的属性 子类需要初始化继承
Employee.__init__(self,name,salary) #调父类的构造器,必须显示不然不会被调用
self.score = score
def salary(self):
print("子类重写父类方法,相当于对父类方法进行覆盖")
print(Student.mro()) # mro()函数 打印类的层次
s=Student("gao",3000,30)
s.salary() # 父类的方法 子类可以直接调用
print(s.name)
print(s._Employee__salary) # 对于父类的私有属性和私有方法需要按照特定格式调用
s._Employee__sat()
print(dir(s))
object根类()
名字小写 ,方法也是属性 只不过可以通过()调用
重写 __str__()方法
class Person:
def __init__(self,name):
self.name = name
def __str__(self):
return "名字是{0}".format(self.name)
p = Person("高")
print(p)
多重继承
一个子类可以有多个直接的父类,类层次结构会复杂 尽量别使用
calss A(B,C)
如果B,C中有重名的方法,调用按照顺序 调用B的方法
super()获得父类的定义,不是父类的对象
class A:
def say(self):
print("A",self)
class B(A):
def say(self):
super().say()
print("B",self)
B().say()
多态
1方法多态
2继承重写
class Man:
def eat(self):
print("吃饭")
class Chinese(Man):
def eat(self):
print("筷子")
class English(Man):
def eat(self):
print("叉子")
def ManEat(m):
if isinstance(m,Man):
m.eat()
else:
print("不吃饭")
ManEat(Chinese())
ManEat(English)
特殊方法和运算符重载
每一个符号都对应一个方法,都是对象
运算符重载
class Person:
def __init__(self,name):
self.name=name
def __add__(self,other):
if isinstance(other,Person):
return "{0}-{1}".format(self.name,other.name)
else:
return "不能相加"
p1=Person("gao")
p2=Person("zzz")
print(p1+p2)
特殊属性
对象的浅拷贝和深拷贝
回顾 python基础5
组合
实现代码复用 is-a关系依然用继承 has-a关系用组合
直接把类当成参数赋给另一个类
设计模式
工厂模式
设计模式
单例模式实现
只生成一个实例对象
class CarFactory:
__obj = None
__init_flag=True
def create_car(self,brand):
if brand=="奔驰":
return Bens()
elif brand == "宝马":
return BMW()
def __new__(cls,*args,**kwargs): # 重写new方法
if cls.__obj==None:
cls.__obj=object.__new__(cls)
return cls.__obj
def __init__(self):
if CarFactory.__init_flag:
print("init")
CarFactory.__init_flag=False
class Bens:
pass
class BMW:
pass
f1=CarFactory()
f2=CarFactory()
print(f1)
print(f2)