面向对象编程OOP
OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数
类和实例
- 类是创建实例的模板,而实例则是一个一个具体的对象,各个实例拥有的数据都互相独立,互不影响
类和实例
- 类是抽象的模板
- 如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类
# 定义学生类
class Student(object):
pass
# 创建学生类的一个实例
stu = Student()
# 对实例绑定属性
stu.name = "薛之谦"
和静态语言不同,Python允许对实例变量绑定任何数据,也就是说,对于两个实例变量,虽然它们都是同一个类的不同实例,但拥有的变量名称都可能不同
由于类起到模板的作用,所以可以在创建实例的时候,通过定义一个特殊的__init__方法,把一些我们认为必须绑定的属性强制填写进去。
class Student(object):
# self表示创建的实例本身
def __init__(self, name, score):
# 在__init__方法内部,把各种属性绑定到self,即实例本身
self.name = name
self.score = score
- 有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去
- 和普通的函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self,并且,调用时,不用传递该参数
数据封装
- 定义类的方法进行数据封装
- 调用方法时,不需要知道内部实现细节
访问限制
- 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问
- 增加get、set方法以允许外部代码修改内部私有数据
# 定义学生类
class Student(object):
def __init__(self, name, gender):
self.name = name
self.__gender = gender
# 定义get方法
def get_gender(self):
return self.__gender
# 定义set方法
def set_gender(self,gender):
if gender == "male" or "female":
self.__gender = gender
else:
print("输入格式有误!")
bart = Student('Bart','male')
# 验证参数有效性
if bart.get_gender() != 'male':
print("测试失败")
else:
bart.set_gender('female')
if bart.get_gender()!='female':
print('测试失败')
else:
print('测试成功')
继承和多态
- 继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写。
- 动态语言的鸭子类型特点决定了继承不像静态语言那样是必须的。
- 廖雪峰Python教程-继承和多态
获取对象信息
type()函数
- 使用type()函数来判断对象类型
>>> type(123)
<class 'int'>
>>> type('str')
<class 'str'>
>>> type(None)
<type(None) 'NoneType'>
- 如果一个变量指向函数或者类,也可以用type()判断
>>> type(abs)
<class 'builtin_function_or_method'>
>>> type(a)
<class '__main__.Animal'>
- 判断一个对象是否是函数,可以使用types模块中定义的常量
>>> import types
>>> def fn():
... pass
...
>>> type(fn)==types.FunctionType
True
>>> type(abs)==types.BuiltinFunctionType
True
>>> type(lambda x: x)==types.LambdaType
True
>>> type((x for x in range(10)))==types.GeneratorType
True
instance()函数
- isinstance()判断的是一个对象是否是该类型本身,或者位于该类型的父继承链上
- 能用type()判断的基本类型也可以用isinstance()判断
>>> isinstance('a', str)
True
>>> isinstance(123, int)
True
>>> isinstance(b'a', bytes)
True
- 判断一个变量是否是某些类型中的一种
>>> isinstance([1, 2, 3], (list, tuple))
True
>>> isinstance((1, 2, 3), (list, tuple))
True
dir()函数
- 获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list
>>> dir('ABC')
['__add__', '__class__',..., '__subclasshook__',
'capitalize', 'casefold',..., 'zfill']
- 通过内置的一系列函数,我们可以对任意一个Python对象进行剖析,拿到其内部的数据。
实例属性和类属性
- Python是动态语言,根据类创建的实例可以任意绑定属性
- 不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,访问到的将是类属性