一、 概念
1. 对象(实例)
> 万物皆对象> 对象是具有 行为(函数)和 属性(变量名)的
举例:桌,椅,板凳
(1) 属性[名词] 材质,长度,性别,长短... ---- 变量名绑定变量值
(2) 行为[动词] 起床、上班、打游戏 ---- 使用函数
2. 类(类别)
> 把具有相同属性和行为的属性划为一类> 类的大小按照需求分,取决于颗粒度的选择
> 划分的时候,一般来说,相同类别的对象之间总是比不同类别的对象之间更相似。
举例:木制品类 --- 桌子、椅子、茶几
学生管理系统:Student, Teacher
公交刷卡系统:Person, Ticket, Station
3. 类和对象之间的关系
> 类是对象的抽象,对象是类的具体体现> 类 --- 模板、蓝图
对象 --- 类设计出来的实例
举例:
人的类: 身高、体重、 身高
人的对象: [name = 张三, 身高 = 180, 体重 = 130]
二、 定义和初始化
1. 类的定义
(1) 格式
class 类名[(父类)]: # ()可写可不写#‘注释:某各类’
类体
举例:
class Person:
(2) 产生对象: 类名()
举例:p1 = Person -----打印出是对象的地址
# 输出注释
print(p1.__doc__)
> 一般情况下,把属性和行为定义到类中,称为实例属性和实例方法
2. 定义类中的属性和行为
(1) 在类中定义对象的行为
类的行为: 以函数的形式存在,相当于在类体中定义函数,来处理对象> 调用类中的行为的时候,self不需要传
> 定义在类中的属性和行为(方法),可以直接访问
> self表示当前对象
举例:
class Person:
def run(self): # self表示当前对象
print('I am running')
p1 = Person()
p1.run()
(2) 定义类中的属性(对象的初始化)
def __init__(self): # self为约定俗成> __init__在创建对象时候执行,但是该方法不是创建初始化的方法
> 对象的属性通过self.属性名=属性值 来赋值
> 如果一个信息和该类不相关,尽量不要定义为类中的属性,而是传入对象
> 能够定义在init中的属性,一定是类的强依赖关系
> 弱依赖属性通常先赋值None,调用前赋值
举例:
class Person:
def __init__(self, name, age):
print('z')
print('执行__init__:')
对于当前person类产生的所有对象都产生作用,即都包含name属性
# 可以通过传入参数的形式,创建对象
self.name = name
self.age = age
# 在类的实例方法中, 调用实例属性,需要用self
def run(self, place): # self表示当前对象
print('{} am running at {}'.format(self, place))
p1 = Person('张珊',20)
print(p1.age)
print(p1.run('公路'))
Practice:
1. 创建一个狗类:
2. 定义对象属性: name age type
3. 定义对象的行为
class Dog:
'''
Practice:
1. 创建一个狗类:
2. 定义对象属性:
3. 定义对象的行为
叫:
吃饭:
睡觉:
'''
# 创建对象属性
def __init__(self, name, age, type):
self.name = name
self.age = age
self.type = type
def bark(self):
return '叫什么叫'
def eat(self, sth):
return '{}今天吃{}'.format(self.name,sth)
def sleep(self, time):
if time not in range(6,20):
return '还是白天,睡什么睡'
else:
return '该休息了了'
dog1 = Dog('Tom',12,'金毛')
dog2 = Dog('Jeff',2,'二哈')
dog3 = Dog('Lisa',3,'银狐')
print(dog1)
print(dog3.eat('狗粮'))
print(dog2.sleep(1))
3. 类中的成员
1)实例属性和实例方法
2)类属性和类方法
3)静态方法
(1)类属性
不需要通过init方法,直接在类下定义,以变量绑定的形式存在> 实例属性跟每一个对象相关,类属性只跟类有关,与对象无关,独享
> 类属性是公用的,类属性只跟类有关,与对象无关
访问: 必须现有实例,通过实例才能访问到实例属性
a. 类名.类属性,可以访问和修改类属性(推荐)
b. 对象.类属性,不能修改类属性
# 例子:
class Person:
desc = '人的描述' # 类属性
def __init__(self):
self.name = name # 实例属性定义在init下
p1 = Person ()
# 访问
print(Person.desc)
print(p1.desc)
# 但是作用不同
Person.desc = 'sds' ---
p1.desc = 'sds' (不能对类属性进行更改)---给一个实例(对象),加了一个实例属性
# 只取就近什么意思
(2) 类方法
> 只跟类相关的方法> 实例方法跟每一个对象关联
> 需要加一个装饰器@classmethod
> 可以通过来表示
a. 对象.类方法
b. 类名.类方法访问
> 应用场合: 给类方法实现复制对象的功能
> cls代表当前类
class Person:
desc = 'new'
def __init__(self, name, age)
self.name = name
self.name = age
@classmethod
def class_method(cls): #cls当前类
print(cls is Person)
def run(self):
pass
@classmethod
def copy1(p):
p1 = Person ()
p2 = Person.copy(p1)
(3) 方法对于属性的访问:
1) 类方法访问类属性 --- cls
直接使用cls2) 类方法访问实例属性 --- 不推荐
# 类方法:承诺只跟类有关,在类方法下访问实例不合理# 如果一定要访问,可以添加
3) 实例方法访问类属性 --- 类名,__class__desc
a. Person.descb. self.__class__desc # 表示当前对象所在的类,通过self找cls
# 推荐