面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。
理解对象和引用
在python中,当创建一个a=2时,内部的创建流程是先根据Integer class在内存中开辟一段内存空间,得到对象ID后填充对象的类型和值2,然后将变量a的引用指向这个对象,因此在便宜python中变量只是访问对象的一把钥匙而已。
- 列表、字典是可变的对象,元组、字符串、整型、浮点型、布尔型对象都是不可变的对象,不可变对象的最大的好处是:线程安全的
- 对于可变对象(list\dict)才能深拷贝,对于不可变对象只能浅拷贝
动态强类型语言
动态类型:一个变量在程序运行过程中类型发生改变(适合小型项目)
静态类型:一个变量在程序运行过程中类型不能发生改变(适合大型语言)
强类型:越不支持隐式类型转换类型越强(类型检查严格)
弱类型:越支持隐式类型转换类型越弱
python是动态强类型语言,C+是静态弱类型语言,Java是静态弱类型语言,javascript是动态弱类型语言。
自省
指对象在程序运行时能获取到一些自己的信息。
在python中创建一个类使用class关键字
class 类名(继承自哪个类)
#括号内的内容也可省略,表示继承公共的符类Object
class Test():
成员方法
成员变量
def Print(self):
"""
实例方法:成员函数/普通方法
"""
#成员变量不需要提前声明,在成员方法中声明
self.num=19
print("hello")
print(self.y)
私有的成员变量在变量的前缀前加双下划线__
表示
类属性
class Test():
'''
这是一个用来测试类创建语法的类
'''
# pass
#类属性(静态变量)
val=88
静态方法
#静态方法,并不是Java中的静态成员函数,不能调用类属性
@staticmethod#装饰器
def Func():
print("in fun")
#Func=staticmethod(Func)#或是用装饰器代替
类方法
#类方法
def Func2(cls):
"""
类方法可以调用类属性
"""
print(cls.val)
构造函数
def __init__(self,a=10):
#构造函数,在类创建时会进行初始化
#若是出现在成员函数中的变量需要调用了函数后对成员变量进行初始化了才能进行调用
#因此一个类的实例属性最好都放在__init__中
self.x=10
self.y=a
继承
class Parent():
def __init__(self):
self.msg='hehe'
def PrintMessage(self):
print(self.msg)
class Child(Parent):
pass
#继承了父类的子类即使什么也不干,也可以创建子类对象,调用父类的方法
c=Child()
c.PrintMessage()
若在子类中定义了与父类同名的方法,那么会直接覆盖父类的方法
class Child(Parent):
def PrintMessage(self):
print("child")
若在子类中也定义了与父类同名的构造方法,那么可以在子类的构造方法中使用super().__init__()
来显式的调用父类的构造方法
python中的多态
#python中的多态
"""
从函数的角度看,并不知道xy的具体类型
但是知道xy支持相加操作,不管啥类型,都往一起相加,这就是python中的多态
"""
def add(x,y):
return x+y
print(add(10,20))
print(add("hello","world"))
print(add([1,2,3],[4,5,6]))
类和实例中的常用内建函数
判断一个对象是不是一个类的实例isinstance(对象,类)
对一个类/对象的属性进行操作和判断hasattr()/getattr()/setattr()/delattr()
查看类/对象的所有属性和方法dir()/vars()
__str__(self)
:类似于Java中的toString()