做个好员工还是做个好领导???
众所周知,python是世界上入门最简单的语言!?——周某人
面向对象
-
与面向过程相比:
- 面向过程:数学逻辑的映射,学会做个好员工
- 面向对象:生活逻辑的映射,学会做个好领导
-
类和对象在生活中的实例:
- 类: 用来描述具有相同的属性和方法的对象的集合
- 对象:万物皆对象
类 对象 人 小明、老王 手机 你的手机、我的手机 动物 小狗、小喵 - 官方定义:
- 类:具有相同特征(属性和行为)事物的抽象
- 对象:某个类的具象
- 编程语言:
- 类:是一种自定义的数据类型
- 对象:某个类类型的变量
基础语法
-
类的定义
class 类名: pass
-
使用说明:
- 定义类的关键字是
class
- 类名:符合标识符命名规范即可,通常采用大驼峰命名风格
UserName
- 属性可以通过变量体现,行为通过函数体现
- 成员访问:
- 属性:
对象.属性名
- 方法:
对象.方法名
- 属性:
- 示例:
# 定义类 class Person: # 行为通过函数体现 # 吃饭 def eat(self): print('毛氏红烧肉,听说很好吃!') # 睡觉 def sleep(self): print('喜欢睡觉也是生活态度!') # 创建对象 p = Person() # print(p) # 属性可以动态添加 p.name = 'ergou' p.age = 22 print(p.name, p.age) # 调用成员方法 p.eat() p.sleep()
- 定义类的关键字是
-
self
使用
self
表示当前对象,也就是调用类方法的对象class Person: def run(self): # self表示当前对象,就是调用该方法的对象 print('{}每天以2m/s的速度奔跑5km'.format(self.name)) def introduce(self): # 访问成员属性 print('我叫{},今年18岁'.format(self.name)) # 调用成员方法 # self的名字可以修改,但是通常都不改,调用方法时该参数不传 self.run() lulu = Person() lulu.name = '露露' # lulu.run() lulu.introduce() yanbo = Person() yanbo.name = '彦博' # yanbo.run() yanbo.introduce()
常用内置函数(方法)
-
内置函数:在类中,特定的时刻会自动触发的函数
-
__str__
函数:打印对象时默认打印:类名+地址。将该方法重写,打印对象时就会打印该方法的返回值,该方法返回一个字符串:class Person: # 使用str方法强制类型转换时也会调用该方法 def __str__(self): return '我是{},今年{}岁'.format(self.name, self.age) p = Person() p.name = '勒布朗.詹姆斯' p.age = 34 print(p) s = str(p) print(s)
-
__init__
函数:该方法成为构造方法,创建对象之后自动调用,可以进行初始化设置:class Cat: def __str__(self): return 'name:{},age:{},color:{}'.format(self.name, self.age, self.color) def __init__(self, name, age, color): self.name = name self.age = age self.color = color jiafei = Cat('加菲', 2, '橘黄色') print(jiafei)
-
__del__
函数:析构方法,当对象释放时,系统会自动调用,该方法一般做资源释放操作,如:断奶数据库链接、文件关闭class Pig: def __del__(self): print('大师兄,我不行了') bajie = Pig() del bajie print('八戒,一路走好!')
常用属性操作函数
-
__setattr__
:当设置属性时会自动触发 -
__getattr__
:当获取不存在的属性时会自动触发 -
__delattr__
:销毁对象的指定属性时会自动触发 -
综合示例:
class Person: def __init__(self, name): self.name = name # print('初始化对象') # 当设置属性时会自动调用 def __setattr__(self, key, value): # print(key, value) self.__dict__[key] = value # 当获取不存在的属性时会自动触发 def __getattr__(self, item): if item == 'age': return 18 else: return '你猜' # 销毁对象的指定属性时会自动触发 def __delattr__(self, item): print(item, '属性即将销毁') xiaoming = Person('小明') # xiaoming.name = '小明' print(xiaoming.age) print(xiaoming.height) print(xiaoming.__dict__) del xiaoming.name print('over')
将对象当作字典操作的内置函数
-
__setitem__
:将对象当做字典操作,添加或设置属性时自动触发 -
__getitem__
:将对象当做字典操作,根据键获取值时会自动触发 -
__delitem__
:将对象当做字典操作,根据键销毁属性时会自动触发 -
综合示例:
class Person: # 将对象当做字典操作,添加或设置属性时自动触发 def __setitem__(self, key, value): # print(key, value) self.__dict__[key] = value # 将对象当做字典操作,根据键获取值时会自动触发 def __getitem__(self, item): # print(item) return self.__dict__.get(item) # 将对象当做字典操作,根据键销毁属性时会自动触发 def __delitem__(self, key): print(key, '属性即将销毁') del self.__dict__[key] xiaoming = Person() xiaoming['name'] = '小明' print(xiaoming['name']) del xiaoming['name'] print(xiaoming['name'])
将对象当作函数调用的函数
-
__call__
:将对象当做函数调用,该方法会自动触发,必须重写类的call方法 -
具体示例:
class Person: # 将对象当做函数调用,该方法会自动触发 def __call__(self, *args, **kwargs): # print('__call__', args) return sum(args) p = Person() # 将对象当做函数调用,必须重写类的call方法 ret = p(1, 2, 3) print(ret) def test(): pass # 判断一个对象是否可以调用 print(callable(p)) print(callable(test)) # 判断一个对象是否是函数 from inspect import isfunction print(isfunction(p)) print(isfunction(test)) # 判断对象是否拥有指定属性,若对象可以调用,那么一定拥有__call__属性 print(hasattr(p, '__call__')) print(hasattr(test, '__call__'))
总结
这一部分的内容应该不算太难消化,大约用一个上午的时间就能完全消化,脑子里面多想几个生活中的实例,用面向对象思想的方法写下来,大约一天到两天就能完全掌握面向对象的基础了。
下期预告:下一期将讲解Python面向对象的三大特点:封装、继承和多态
Tips:如有疑问欢迎随时打扰 ???