1.面向过程:用线性的思维,即按照做事的步骤一步一步去做。
面向对象:利用事物之间的关系,将事情分为几个模块,将模块串联,而不用去管模块内的具体做法。
2.类:事物的类别。
对象:某一类下的不同个体,Python中一切皆对象。
3.类的组成
①类属性:在类中且不在实例方法中定义的变量,被所有的实例对象所共有。
②实例方法:类中定义的函数
③静态方法:用@staticmethod修饰,不能带有self。
④类方法:用@classmethod修饰,将self换成cls。
⑤__init__()方法
def __init__(self,name,age):
self.name=name #将局部变量name的值赋值给实例变量self.name
self.age=age
4.多态:在不知道变量是什么类型时,仍然可以通过这个变量调用方法。
class Animal(object):
def eat(self):
print('动物要吃食物')
class Dog(Animal):
def eat(self): #重写父类方法
print('狗吃肉')
class Cat(Animal):
def eat(self):
print('猫吃鱼')
class Person(object):
def eat(self):
print('人吃饭饭')
def fun(obj): #多态
obj.eat()
fun(Dog())
fun(Cat())
fun(Person())
狗吃肉
猫吃鱼
人吃饭饭
5.特殊方法
①方法__add__():通过重写__add__()方法,可使自定义对象具有‘+’功能。
class Student():
def __init__(self,name):
self.name=name
def __add__(self, other):
return self.name+other.name
stu1=Student('张三')
stu2=Student('李四')
s=stu1+stu2
print(s)
s=stu1.__add__(stu2)
print(s)
张三李四
张三李四
②方法__new__():创建对象
方法__init__():对创建的对象进行初始化
class Person(object):
def __new__(cls, *args, **kwargs):
print('__new__()被调用执行了,cls的id值为{0}'.format(id(cls)))
obj=super().__new__(cls)
print('创建的对象的id为:{0}'.format(id(cls)))
return obj
def __init__(self,name,age):
print('__init__()被调用了,self的id值为:{0}'.format(id(self)))
self.name=name
self.age=age
print('object这个类的id为:{0}'.format(id(object)))
print('Person这个类的id为:{0}'.format(id(Person)))
p1=Person('张三',20)
print('实例p1的id:{0}'.format(id(p1)))
object这个类的id为:1360250304
Person这个类的id为:3812680
__new__()被调用执行了,cls的id值为3812680
创建的对象的id为:3812680
__init__()被调用了,self的id值为:40516688
实例p1的id:40516688
6.浅拷贝
子对象内容不拷贝,源对象和拷贝对象指向同一子对象。
class CPU:
pass
class Disk:
pass
class Computer:
def __init__(self,cpu,disk):
self.cpu=cpu
self.disk=disk
cpu1=CPU()
disk=Disk()
computer=Computer(cpu1,disk)
#浅拷贝
import copy
computer1=copy.copy(computer)
print(computer,computer.cpu,computer.disk)
print(computer1,computer1.cpu,computer1.disk)
<__main__.Computer object at 0x0000000001EA9470> <__main__.CPU object at 0x0000000001EA3CC0> <__main__.Disk object at 0x0000000001EA9358>
<__main__.Computer object at 0x0000000001EA95F8> <__main__.CPU object at 0x0000000001EA3CC0> <__main__.Disk object at 0x0000000001EA9358>
7.深拷贝
源对象和拷贝对象的子对象不同。
import copy
computer2=copy.deepcopy(computer)
print(computer,computer.cpu,computer.disk)
print(computer2,computer2.cpu,computer2.disk)
<__main__.Computer object at 0x0000000001E39470> <__main__.CPU object at 0x0000000001E33CC0> <__main__.Disk object at 0x0000000001E39358>
<__main__.Computer object at 0x0000000001E39828> <__main__.CPU object at 0x0000000001E39CF8> <__main__.Disk object at 0x0000000001E39D68>