目录
1、重载
1.1方法的动态性
2、 私有属性和私有方法(实现封装)
3、@property装饰器
3.1将一个方法调用方式变为“属性调用”。
3.2装饰器的用法
4、面向对象的三大特征
4.1继承
4.2方法重写
5、object的根类
6、重写__str()__方法
7、多重继承
8、super()获得分类的定义
9、多态
10、特殊方法和运算符重载
11、特殊属性
12、对象的浅拷贝和深拷贝
13、组合
14、设计模式_工厂模式的实现
14.1工厂模式
14.2 设计模式_单例模式
1、重载
python方法中没有重载,定义多个同名方法,只有最后一个有效
1.1方法的动态性
class Person:
def work(self):
print("努力上班")
def play_game(s):
print("{0}在玩游戏".format(s))
def work2(s):
print("赚大钱")
Person.play=play_game;
p=Person()
p.work()
p.play() #Person.play(p)
Person.work=work2
p.work()
chenhong
18
['_Employee__age', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name']
进程已结束,退出代码0
2、 私有属性和私有方法(实现封装)
class Employee:
def __init__(self,name,age):
self.name=name
self.__age=age#私有属性
def __work(self):#私有方法
print("好好工作,赚钱娶媳妇")
e=Employee("chenhong",18)
print(e.name)
print(e._Employee__age)
print(dir(e))
C:\Users\86189\anaconda\python.exe C:/Users/86189/PycharmProjects/pythonProject/pythonday8/测试私有属性.py
chenhong
18
['_Employee__age', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name']
进程已结束,退出代码0
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("chenhong",18)
print(e.name)
print(e._Employee__age)
print(dir(e))
e._Employee__work
print(Employee._Employee__company)
C:\Users\86189\anaconda\python.exe C:/Users/86189/PycharmProjects/pythonProject/pythonday8/测试私有属性.py
chenhong
18
['_Employee__age', '_Employee__company', '_Employee__work', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name']
百战程序员
进程已结束,退出代码0
3、@property装饰器
3.1将一个方法调用方式变为“属性调用”。
#测试property最简化的使用
class Employee:
@property
def salary(self):
print("salary run...")
return 10000
emp1=Employee()
#emp1.salary()
print(emp1.salary)
C:\Users\86189\anaconda\python.exe C:/Users/86189/PycharmProjects/pythonProject/pythonday8/测试property.py
salary run...
10000
进程已结束,退出代码0
3.2装饰器的用法
#@property装饰器的用法
class Employee:
def __init__(self,name,age):
self.__name=name
self.__age=age
@property
def age(self):
return self.__age
@age.setter
def set_age(self, age):
if 18 < age < 55:
self.__age = age
else:
print("录入年龄错误,年龄在18-55之间")
''' def get_age(self):
return self.__age
def set_age(self,age):
if 18<age<55 :
self.__age=age
else:
print("录入年龄错误,年龄在18-55之间")
'''
emp1=Employee("chenhong",19)
print(emp1.age)
emp1.set_age=60
print(emp1.age)
C:\Users\86189\anaconda\python.exe C:/Users/86189/PycharmProjects/pythonProject/pythonday8/property的用法.py
19
录入年龄错误,年龄在18-55之间
19
进程已结束,退出代码0
4、面向对象的三大特征
封装(隐藏)
继承
多态
4.1继承
子类(派生类)继承父类(基类)
一个子类可以有多个父类
class Student(Person)
默认为object类
class Person:
def say_age():
print("年龄为18")
class Student(Person):
pass
print(Student.mro())
s=Student
s.say_age()
C:\Users\86189\anaconda\python.exe C:/Users/86189/PycharmProjects/pythonProject/pythonday8/子类和父类.py
[<class '__main__.Student'>, <class '__main__.Person'>, <class 'object'>]
年龄为18
进程已结束,退出代码0
class Person:
def __init__(self,name,age):
self.name=name
self.__age=age#私有属性
def say_age(self):
print("年龄为18")
class Student(Person):
def __init__(self,name,age,score):
Person.__init__(self,name,age)#必须显示的调用父类初始化方法,不然解释器不会去调用
self.score=score
print(Student.mro())
s=Student("陈洪",18,90)
s.say_age()
print(s.name)
#print(s.age)
print(dir(s))
print(s._Person__age)
C:\Users\86189\anaconda\python.exe C:/Users/86189/PycharmProjects/pythonProject/pythonday8/子类和父类.py
[<class '__main__.Student'>, <class '__main__.Person'>, <class 'object'>]
年龄为18
陈洪
['_Person__age', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'say_age', 'score']
18
进程已结束,退出代码0
4.2方法重写
#测试方法的重写
class Person:
def __init__(self,name,age):
self.name=name
self.__age=age#私有属性
def say_age(self):
print("我的年龄",self.__age)
def say_introduce(self):
print("我的名字是{0}".format(self.name))
class Student(Person):
def __init__(self,name,age,score):
Person.__init__(self,name,age)#必须显示的调用父类初始化方法,不然解释器不会去调用
self.score=score
def say_introduce(self):
'''重写了父类的方法'''
print("报告老师,我的名字是:{0}".format(self.name))
s=Student("陈洪",18,90)
s.say_age()
s.say_introduce()
运行结果
C:\Users\86189\anaconda\python.exe C:/Users/86189/PycharmProjects/pythonProject/pythonday8/方法重写.py
我的年龄 18
报告老师,我的名字是:陈洪
进程已结束,退出代码0
5、object的根类
通过类的方法mro()或者类的属性__mro__可以输出这个类的继承层次结构
class A:
pass
class B(A):
pass
class C(B):
pass
print(C.mro())
[<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
dir()查看对象
6、重写__str()__方法
#测试重写object的__str__()
class Person:#默认继承object类
def __init__(self,name):
self.name=name
def __str__(self):
return ("我的名字是:{0}".format(self.name))
p=Person("陈洪")
print(p)
我的名字是:陈洪
进程已结束,退出代码0
7、多重继承
一个子类可以继承多个父类,但是不会经常使用,但是会变得很复杂。
python支持多继承,如果父类中有相同名字的方法,在子类没有指定父类名时,解释器将“从左到右 ”按顺序搜索
mro()层次析构
8、super()获得分类的定义
# 测试super(),代表父类的定义,而不是父类的对象
class A:
def say(self):
print("A",self)
class B(A):
def say(self):
# A.say(self)
super().say()
print("B",self)
B().say()
C:\Users\86189\anaconda\python.exe C:/Users/86189/PycharmProjects/pythonProject/pythonday8/super().py
A <__main__.B object at 0x00000170DD7B1FA0>
B <__main__.B object at 0x00000170DD7B1FA0>
进程已结束,退出代码0
9、多态
1、多态是多态的方法,属性没有多态
2、多态的存在有2个必要条件:继承、方法重写
class Man:
def eat(self):
print("饿了,吃饭啦!")
class Chinese(Man):
def eat(self):
print("中国人用筷子吃饭")
class Enlish(Man):
def eat(self):
print("英国人用叉子吃饭")
class Indian(Man):
def eat(self):
print("印度人用右手吃饭")
def ManEat(m):
if isinstance(m,Man):
m.eat()
else:
print("不能吃饭")
ManEat(Chinese())
ManEat(Indian())
C:\Users\86189\anaconda\python.exe C:/Users/86189/PycharmProjects/pythonProject/pythonday8/多态.py
中国人用筷子吃饭
印度人用右手吃饭
进程已结束,退出代码0
10、特殊方法和运算符重载
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 "不是同类对象,不能相加"
def __mul__(self, other):
if isinstance(other,int):
return self.name*other
else:
return "不是同类对象,不能相乘"
p1=Person("高琪")
p2=Person("陈洪")
x=p1+p2
print(x)
print(p1*3)
C:\Users\86189\anaconda\python.exe C:/Users/86189/PycharmProjects/pythonProject/pythonday8/运算符的重载.py
高琪--陈洪
高琪高琪高琪
进程已结束,退出代码0
11、特殊属性
obj.__dict__ 对象的属性字典
obj.__class__ 对象所属的类
class.__bases__类的基类元组(多继承)
class.__base__ 类的基类
class.__mro__ 类层次结构
class.__subclasses() 子类列表
12、对象的浅拷贝和深拷贝
import copy
class MobilePhone():
def __init__(self,cpu,screen):
self.cpu=cpu
self.screen=screen
class CPU:
def calculate(self):
print("算你个12345")
print("cpu对象",self)
class Screen:
def show(self):
print("显示一个好看的画面,亮瞎你的钛合金大眼")
print("screen对象",self)
#测试变量赋值
c1=CPU()
c2=c1
print(c1)
print(c2)
#测试浅复制
s1=Screen()
m1=MobilePhone(c1,s1)
m2=copy.copy(m1)
print(m1,m1.cpu,m1.screen)
print(m2,m2.cpu,m2.screen)
#测试深复制
print("测试深复制-----------")
m3=copy.deepcopy(m1)
print(m1,m1.cpu,m1.screen)
print(m3,m3.cpu,m3.screen)
C:\Users\86189\anaconda\python.exe C:/Users/86189/PycharmProjects/pythonProject/pythonday8/测试对象的浅拷贝和深拷贝.py
<__main__.CPU object at 0x0000018678DCDFD0>
<__main__.CPU object at 0x0000018678DCDFD0>
<__main__.MobilePhone object at 0x0000018678DCDF70> <__main__.CPU object at 0x0000018678DCDFD0> <__main__.Screen object at 0x0000018678DCDFA0>
<__main__.MobilePhone object at 0x0000018678DCDD90> <__main__.CPU object at 0x0000018678DCDFD0> <__main__.Screen object at 0x0000018678DCDFA0>
测试深复制-----------
<__main__.MobilePhone object at 0x0000018678DCDF70> <__main__.CPU object at 0x0000018678DCDFD0> <__main__.Screen object at 0x0000018678DCDFA0>
<__main__.MobilePhone object at 0x0000018678DCDCD0> <__main__.CPU object at 0x0000018678DCDC10> <__main__.Screen object at 0x0000018678DCDBB0>
进程已结束,退出代码0
13、组合
#使用继承实现代码的复用
class A1:
def say_a1(self):
print("a1,a1,a1")
class B1(A1):
pass
b1=B1()
b1.say_a1()
#同样的效果,使用组合实现代码的复用
class A2:
def say_a2(self):
print("a2,a2,a2")
class B2:
def __init__(self,a):
self.a=a
a2=A2()
b2=B2(a2)
b2.a.say_a2()
C:\Users\86189\anaconda\python.exe C:/Users/86189/PycharmProjects/pythonProject/pythonday8/测试组合.py
a1,a1,a1
a2,a2,a2
进程已结束,退出代码0
14、设计模式_工厂模式的实现
14.1工厂模式
#测试工厂模式
class CarFactory:
def create_car(self,brand):
if brand=="奔驰":
return Benz()
elif brand=="宝马":
return BMW()
elif brand=="比亚迪":
return BYD()
else:
return "未知品牌,无法创建"
class Benz:
pass
class BMW:
pass
class BYD:
pass
factory=CarFactory()
c1=factory.create_car("奔驰")
c2=factory.create_car("比亚迪")
print(c1)
print(c2)
C:\Users\86189\anaconda\python.exe C:/Users/86189/PycharmProjects/pythonProject/pythonday8/工厂模式.py
<__main__.Benz object at 0x000001C65861CFA0>
<__main__.BYD object at 0x000001C65861CF70>
进程已结束,退出代码0
14.2 设计模式_单例模式
#测试工厂模式
class CarFactory:
def create_car(self,brand):
if brand=="奔驰":
return Benz()
elif brand=="宝马":
return BMW()
elif brand=="比亚迪":
return BYD()
else:
return "未知品牌,无法创建"
class Benz:
pass
class BMW:
pass
class BYD:
pass
factory=CarFactory()
c1=factory.create_car("奔驰")
c2=factory.create_car("比亚迪")
print(c1)
print(c2)
C:\Users\86189\anaconda\python.exe C:/Users/86189/PycharmProjects/pythonProject/pythonday8/单例测试.py
init...
<__main__.Mysingleton object at 0x000001D28D6ECFA0>
<__main__.Mysingleton object at 0x000001D28D6ECFA0>
<__main__.Mysingleton object at 0x000001D28D6ECFA0>
进程已结束,退出代码0