【类和对象】
1.什么是对象(object):
对象是指现实中的物体或实体
2.什么是面向对象:
把一切看成对象(实例),让对象和对象之间建立关联关系
3.对象都有什么特征:
对象有很多的属性(名词)
对象有很多的行为(动作或动词)
对象 = 属性 + 方法
一个对象的特征称为“属性”、一个对象的行为称为“方法”
# 特征的描述称为属性,在代码层面来看其实就是变量
# 方法实际就是函数,通过调用这些函数来完成某些工作
例如:
乌龟
从静态特征描述:绿色的、有四条腿、10kg重、有外壳、大嘴巴...
从动态的行为描述:会爬、会跑、咬人、吃东西、睡觉....
4.什么是类:class
拥有相同属性和行为的对象分为一组,即为一个类
类是用来描述对象的工具,用类可以创建同类对象
5.类的创建:
语法:
class 类名(继承列表):
‘’‘类的文档字符串’‘’
实例方法定义(类内的函数称为方法method)
类变量定义
类方法定义
静态方法定义
作用:
创建一个类
用于描述此类对象的行为和属性
类用于创建此类的一个或多个对象(实例(Istance))
注意:
类名后面跟着的小括号,这跟调用函数是一样的
在python中,类名约定用大写字母开头,函数约定用小写字母开头
调用对象里的方法,使用点操作符(.)即可
6.类和对象:
类 | 对象 | 实例对象
(class)| (object)| (Instance Objects)
7.构造函数:
表达式:
类名([创建传参列表])
作用:
创建这个类的实例对象,并返回此实例对象的引用关系
8.实例对象说明:
实例有自己的作用域和名字空间,可以为该实例添加实例变量(属性)
实例可以调用类方法和实例方法
实例可以访问类变量和实例变量
9.实例方法
语法:
class 类名(继承列表):
def 实例方法名(self,参数1,参数2,...):
'''实例方法的文档字符串'''
语句块
作用:
用于描述一个对象的行为,让此类型的全部对象都拥有相同的行为
说明:
实例方法实质是函数,是定义在类内的函数
实例方法至少有一个形参,第一个形参代表调用这个方法的实例,一般命名为‘self’
实例方法的调用语法:
实例.实例方法名(调用传参)
或
类名.实例方法名(实例,调用传参)
10.属性(attribute)也叫实例变量
每个实例都可以有自己的变量,此变量称为实例变量(也叫属性)
属性的使用语法:
实例.属性名
赋值规则:
首次为属性赋值则创建此属性
再次为属性赋值则必变属性的绑定关系
作用:
用来记录对象自身的数据
11.删除属性:
用del语句可以删除一个对象的实例变量
语法:
del 对象.实例变量名
示例:
>>> class Cat:
pass
>>> c1 = Cat()
>>> c1.color = '白色'
>>> print(c1.color)
白色
>>> del c1.color
>>> print(c1.color)
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
print(c1.color)
AttributeError: 'Cat' object has no attribute 'color'
-------------------------------------------------------------------
12.初始化方法__init__:
作用:
对新创建的对象添加实例变量(属性)或相应的资源
语法格式:
class 类名(继承列表):
def __init__(self [,形参列表]):
语句块
说明:
1.初始化方法名必须为__init__不可改变
2.初始化方法会在构造函数创建实例后自动调用,且实例自身通过第一个参数self传入__init__方法
3.构造函数的实参将通过__init__方法的形参列表传入__init__方法中
4.初始化方法内部如果需要返回则只能返回None
示例:
# 此示例示意__init__方法的调用和添加实例变量
class Car:
def __init__(self,c,b,m):
self.color = c # 颜色
self.brand = b # 品牌
self.model = m # 型号
def run(self,speed):
print(self.color,'的',self.brand,self.model,
'正在以',speed,'公里/小时的速度行驶!')
def set_color(self,clr):
# 此方法用来修改车的颜色
self.color = clr
a4 = Car('红色','奥迪','A4')
a4.run(120)
a4.set_color('黑色')
a4.run(180)
# a4.__init__('白色','Tesla','Model S') # 显示调用
终端打印:
红色 的 奥迪 A4 正在以 120 公里/小时的速度行驶!
黑色 的 奥迪 A4 正在以 180 公里/小时的速度行驶!
--------------------------------------------------------------
13.析构方法__del__(self):
语法:
class 类名(继承列表):
def __del__(self):
语句块
说明:
析构方法在对象销毁时被自动调用
作用:
清理此对象所占用的资源
建议:
python不建议在析构方法内做任何事情,因为对象销毁的时间难以确定
示例:
# 此示例示意__del__方法的用法
class Car:
def __init__(self,name):
self.name = name
print('汽车',name,'对象以创建')
def __del__(self):
print(self.name,'对象已销毁')
c1 = Car('BYD E6')
# del c1
c1 = Car('BMW X5')
while 1: # 死循环,为了阻止程序退出
pass
汽车 BYD E6 对象以创建
汽车 BMW X5 对象以创建
BYD E6 对象已销毁
--------------------------------------------
14.预置实例属性:
__dict__属性:
此属性绑定一个存储此实例自身实例变量(属性)的字典
键表示的是属性名,值表示的是属性相应的数据值
__class__属性:
此属性用来绑定创建此实例的类
作用:
可以借助此属性来访问创建此实例的类
示例:
class Dog:
pass
dog1 = Dog()
dog2 = Dog()
dog3 = dog1.__class__() # 创建dog1的同类对象
>>> class Dog:
pass
>>> dog1 = Dog()
>>> dog1.__class__
<class '__main__.Dog'>
>>> dog1.__class__ is Dog
True
>>> L = [1,2,3,4]
>>> L.__class__
<class 'list'>
>>> dog2 = dog1.__class__() # 等同于dog1=Dog()
>>> dog2.__class__
<class '__main__.Dog'>
-------------------------------------------------------
15.面向对象的综合示例:
有两个人:张三、35岁/李四、8岁。行为:教别人学东西(teach)、赚钱、借钱。
事情:张三教李四学python、李四教张三学跳皮筋、张三上班赚了1000元钱、李四向张三借了200元。
代码如下:
# 此示例示意如何用面向对象的方式创建对象
# 并建立对象与对象之间的逻辑关系
class Human:
'''人类,用于描述人的行为和属性'''
def __init__(self,n,a):
self.name = n # 姓名
self.age = a # 年龄
self.money = 0 # 钱数为0
def teach(self,other,skill):
print(self.name,'教',other.name,'学',skill)
def works(self,money):
self.money += money
print(self.name,'工作赚了',money,'元')
def borrow(self,other,money):
if other.money > money:
print(other.name,'借给',self.name,money,'元')
other.money -= money
self.money += money
else:
print(other.name,'没钱借给',self.name)
def show_info(self):
print(self.age,'岁的',self.name,
'存有',self.money,'元钱')
# 以下是类的使用
zhang3 = Human('张三',35)
li4 = Human('李四',8)
zhang3.teach(li4,'python')
li4.teach(zhang3,'跳皮筋')
zhang3.works(1000)
li4.borrow(zhang3,200)
zhang3.show_info()
li4.show_info()
--------------------
张三 教 李四 学 python
李四 教 张三 学 跳皮筋
张三 工作赚了 1000 元
张三 借给 李四 200 元
35 岁的 张三 存有 800 元钱
8 岁的 李四 存有 200 元钱
--------------------------------------------
16.用于类的函数:
0.查看python内键类的继承关系的函数:
help(__builtins__)
1.【isinstance(obj,class_or_tuple)返回这个对象obj是否某个类class或某些类的实例对象
如果是则返回True,否则返回False】
type(obj) 返回对象的类型
以下是小甲鱼书本:
isinstance(obj,classinfo)
如果第一个参数(object)是第二个参数(classinfo)的实例对象,则返回True,否则返回False:
(1)如果object是classinfo的子类的一个实例,也符合条件
(2)如果第一个参数不是对象,则永远返回False
(3)classinfo可以是类对象组成的元组,只要object是其中一个候选对象的实例,则返回True
(4)如果第二个参数不是类或者由类组成的元组,会抛出一个TypeError异常
示例:
>>> class A:
pass
>>> class B(A):
pass
>>> class C:
pass
>>> b1 = B()
>>> isinstance(b1,B)
True
>>> isinstance(b1,C)
False
>>> isinstance(b1,A)
True
>>> isinstance(b1,(A,B,C))
True
----------------------------------------------------------------------------
2.issubclass(cls,class_or_tuple)
判断一个类是否继承自其他的类,如果此类cls是class或tuple中的一个派生子类则返回True,否则返回False
小甲鱼教程:
issbuclass(class,classinfo)
如果第一个参数(class)是第二个参数(classinfo