和Java相比,Python的面向对象更加彻底。
函数和类也是对象,是python的一等公民。
代码和模块也可以称之为对象。
python中的类也是对象,类可以理解为模板,根据这个模板去生成我们的对象,可以动态修改类的属性。
何为一等公民?
类是由type来生成的一个对象,object是所有类都要继承的最顶层的一个基础类,type也是一个类,同时也是一个对象。
看代码片段一:
a = 1
b = "abc"
print(type(1))
print(type(int))
print(type(b))
print(type(str))
打印出的结果:
代码片段二:
class Student:
pass
class MyStudent(Student):
pass
stu = Student()
print(type(stu))
print(type(Student))
print(int.__bases__)
print(str.__bases__)
print(Student.__bases__)# 打印Student基类
print(MyStudent.__bases__)# 打印Student基类
print(type.__bases__)
print(object.__bases__) # 最顶层的类的基类为空
print(type(object))
打印出的结果:
(,)
(,)
(,)
(,)
(,)
()
可以看到,类是由type来生成的一个对象。
上述代码建议反复阅读练习。
首先说明对象的三个特征:
常见内置类型:
a = None
b = None
print(id(a) == id(b))
打印结果:
Ture
可以看到a,b是指向同一个对象(id相同)。
问:什么是魔法函数?
答:双下划线开头,双下划线结尾的这些函数,通常称之为魔法函数。
例如:
一般魔法函数不要自定义,使用 Python 提供的即可。
使用 Python 提供的魔法函数,为了增强类的特性。
代码:使用魔法函数之前
class Company(object):
def __init__(self, employee_list):
self.employee = employee_list
company = Company(["tom", "bob", "jane"])
for i in company.employee:
print(i)
打印结果:
a
b
c
代码:使用魔法函数之后
class Company(object):
def __init__(self, employee_list):
self.employee = employee_list
def __getitem__(self, item):
return self.employee[item]
company = Company(["a", "b", "c"])
打印结果:
a
b
c
可以看到__getitem__()
这个魔法函数的功能。
定义了这个魔法函数后,实例化后的对象就隐含的变为可迭代对象(iterable)。
for循环其实是要拿到一个对象的迭代器,迭代器是需要实现__iter__
这个方法才会有迭代器特性,Python语法会做一些优化,如果拿不到迭代器,就会尝试去对象中找__getitem__
这个方法,如果有的话就会调用这个方法,一次一次直到将数据取完。这是python语言本身解释器会完成的功能。
魔法函数调用不需要显示调用,解释器会隐式调用。
魔法函数是Python数据模型的一个概念而已,因为网络上大家喜欢称之为魔法函数。
Python数据模型会增强对象的特性。
class Company(object):
def __init__(self, employee_list):
self.employee = employee_list
def __getitem__(self, item):
return self.employee[item]
def __len__(self):
return len(self.employee)
company = Company(["a", "b", "c"])
print(len(company))
结果:
3
__len__
魔法函数增强了company对象的特性。
因为魔法函数很多,类似的魔法函数请大家自行去网上查找,并查看用法。