1.Python方法没有重载
class Person:
def work(self):
print("努力上班!")
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.work=work2#修改旧的方法
p.work()
结果:
努力上班,我就不
<__main__.Person object at 0x000001377B06C668>在玩游戏
好好工作赚钱
进程已结束,退出代码0
2.Python的私有属性和私有方法
class Person:
def __init__(self,name,age):
self.name=name
self.__age=age#私有属性的定义方法
def __work(self):#私有方法的定义
print("努力工作")
print("年龄:{0}".format(self.__age))
e=Person("lily",18)
print(e.name)
print(e._Person__age)#私有属性的访问方法
e._Person__work()#私有方法的访问方法
结果:
lily
18
努力工作
年龄:18
进程已结束,退出代码0
这里可以看到调用的是emp1.salary而不是 emp1.salary(),说明调用的的一个属性而不是方法
class Person():
@property
def salary(self):
return 30000
emp1=Person()
print(emp1.salary)
4.
#测试继承的使用
class Person():
def __init__(self , name , age):
self.name=name
self.__age=age#私有属性
def say_age(self):
print('i dont know...')
class Student(Person):
def __init__(self,name,age,score):
Person.__init__(self,name,age)#必须显式地调用父类初始化方法,不然解释器不会去调用
self.score=score
s=Student("lily",18,60)
s.say_age()
print(s.name)
print(s._Person__age)
结果:
i dont know...
lily
18
进程已结束,退出代码0
5.方法重写
#测试方法的重写
class Person():
def __init__(self , name , age):
self.name=name
self.__age=age#私有属性
def say_age(self):
print('i dont know...')
def say_name(self):
print("my name is {0}".format(self.name))
class Student(Person):
def __init__(self,name,age,score):
Person.__init__(self,name,age)#必须显式地调用父类初始化方法,不然解释器不会去调用
self.score=score
def say_name(self):
'''重写了父类的方法'''
print("please,my name is {0}".format(self.name))
s=Student("lily",18,60)
s.say_name()
结果:
plaese,my name is lily
进程已结束,退出代码0
6.dir()和mro()
上述例子运行结果:
s=Student("lily",18,60)
s.say_name()
print(dir(s))
print(Student.mro())
结果:
plaese,my name is lily
['_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', 'say_name', 'score']
[<class '__main__.Student'>, <class '__main__.Person'>, <class 'object'>]
进程已结束,退出代码0
7.重写__str__()方法:
class Person():
def __init__(self , name):
self.name=name
def __str__(self):
return "name is :{0}".format(self.name)
p=Person("lily")
print(p)
结果:
name is :lily
进程已结束,退出代码0
8.9.
此时输出:say BBB!
10.测试super()方法
class A():
def say(self):
print("A",self)
class B(A):
def say(self):
super().say()
print("B", self)
B().say()
测试:
A <__main__.B object at 0x0000015D8327C2B0>
B <__main__.B object at 0x0000015D8327C2B0>
进程已结束,退出代码0
11.多态是指同一个方法调用由于对象不同可能会产生不同的行为。
class A():
def say(self):
print("A")
class B(A):
def say(self):
print("B")
class C(A):
def say(self):
print("C")
def letter(m):
if isinstance(m,A):
m.say()#多态,一个方法调用,由于传进来的对象不同,输出结果不同
else:
print("D")
letter(C())
结果:
C
进程已结束,退出代码0
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,m2.screen)
print(m2,m2.cpu,m2.screen)
print()
#测试深复制,发现它们不是指向同一个对象,子对象也不一样
m3=copy.deepcopy(m1)
print(m1,m1.cpu,m2.screen)
print(m2,m3.cpu,m3.screen)
结果:
<__main__.cpu object at 0x0000023D80BFC710>
<__main__.cpu object at 0x0000023D80BFC710>
<__main__.mobilephone object at 0x0000023D80BFCB00> <__main__.cpu object at 0x0000023D80BFC710> <__main__.screen object at 0x0000023D80BFCA20>
<__main__.mobilephone object at 0x0000023D80BFCD68> <__main__.cpu object at 0x0000023D80BFC710> <__main__.screen object at 0x0000023D80BFCA20>
<__main__.mobilephone object at 0x0000023D80BFCB00> <__main__.cpu object at 0x0000023D80BFC710> <__main__.screen object at 0x0000023D80BFCA20>
<__main__.mobilephone object at 0x0000023D80BFCD68> <__main__.cpu object at 0x0000023D80BF8400> <__main__.screen object at 0x0000023D80BF8518>
进程已结束,退出代码0
13.组合与继承
#使用继承实现代码复用
class A():
def say(self):
print("AAA")
class B(A):
pass
b=B()
b.say()
#使用组合实现代码复用
class A1():
def say(self):
print("BBB")
class B1(A1):
def __init__(self,a):
self.a=a
b1=B1(A1())
b1.a.say()
结果:
AAA
BBB
进程已结束,退出代码0
14.两种设计模式:工厂模式和单例模式
结果:
#测试单例模式
class MySingleton:
__obj = None
__init_flag = True
def __new__(cls,*args,**kwargs):
if cls.__obj==None:
cls.__obj =object.__new__(cls)
return cls.__obj
def __init__(self,name):
if MySingleton.__init_flag:
print("init...")
self.name=name
MySingleton.__init_flag=False
a=MySingleton("aa")
b=MySingleton("bb")
print(a)
print(b)
结果:
init...
<__main__.MySingleton object at 0x000002158A5DBFD0>
<__main__.MySingleton object at 0x000002158A5DBFD0>
进程已结束,退出代码0