【Python】第十部分 类与对象
文章目录
10. 类与对象
10.1 什么是类?
类就是对一群具有相同特征和行为的事物一个统称,是抽象的,不能直接被使用
特征 --> 属性
行为 --> 方法
类其实就是一个模板,或者说是一个图纸,用来创建很多对象,对象就是由图纸所创造出来的,所以具备类中的属性和方法
10.2 创建类
语法:
class 类名:
pass
# 创建一个简单的类(只包含方法)
class Student:
def run(self):
print('学生们在跑步!')
def swimming(self):
print('学生们在游泳!')
# 创建实例对象
s = Student()
# 调用Student中的方法
s.run() # 学生们在跑步!
s.swimming() # 学生们在游泳!
# 我们输出一下看看对象和类
# 对象中的十六进制其实存储的就是它的id
print(s, id(s)) # <__main__.Student object at 0x0000028CF8B51A58> 2804491295320
print(Student, id(Student)) # <class '__main__.Student'> 2456759623672
10.3 方法中self参数
self
:由哪一个对象调用的方法,方法内self就是哪一个对象的引用
# 个人理解很像this
# 我们在调用方法的时候不需要传递self参数,在方法的内部可以使用self去访问方法和属性
'''
下面的案例使用给对象设置属性,非常简单,但是不推荐使用,因为对象属性应该封装在类的内部
这里为了讲解使用,给对象添加属性, 对象.属性名 = 属性值
'''
class Cat:
def eat(self):
print(f'{self.name}吃鱼')
def run(self):
print(f'{self.name}快跑')
c = Cat()
c.name = '小黄'
c.run() # 小黄快跑
c.eat() # 小黄吃鱼
'''
上述代码的隐患,如果在添加name属性之前调用run和eat方法就会报错
因为找不到name这个属性,所以这种添加属性的方法简单但是不推荐使用
'''
10.4 常用的内置方法
方法名 | 类型 | 作用 |
---|---|---|
new | 方法 | 创建对象的时候,会被自动调用 |
init | 方法 | 对象初始化的时候,会被自动调用 |
del | 方法 | 对象从内存中被销毁的时候,会自动被调用 |
str | 方法 | 返回对象描述信息的时候,print函数输出使用 |
"""
初始化方法 (__init__)专门用来去定义一个类中具体有哪些方法
当对象初始化的时候会被自动调用(即当使用类名()创建对象时)
"""
"""
在__init__方法的内部 self.属性名 = 属性值 就可以定义属性,
定义属性后,在创建该类的对象就都会拥有该属性
"""
"""
__del__方法,当一个对象在内存中被销毁前,会自动调用该方法
使用的场景:如果希望对象在被销毁前,处理一些事情就可以在该方法中操作
"""
"""
__str__方法,如果在开发的过程中,希望print函数输出类对象这个变量,同时能够打印我们自定义的内容,就可以使用__str__,需要注意:该方法必须要返回一个字符串
"""
"""__new__和__init__下面的部分会单独去讲"""
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def hello(self):
print(f'大家好!我叫{self.name},今年{self.age}')
def __del__(self):
print('我被销毁了')
def __str__(self):
return f'我是__str__方法,调用我的是{self.name}'
d = Dog('小七', 18)
d.hello()
# 如果不使用__str__,默认会输出为<class '__main__.Dog'> 2456759625572
print(d) # 我是__str__方法,调用我的是小七
10.5 基本术语
"""
基本术语
类本身也是一个对象,下面介绍的时候就表述为类对象
创建出来的对象叫做类的实例
创建这个动作叫做实例化
对象的属性就叫做实例属性
对象调用的方法就叫做实例方法
"""
class Food:
def __init__(self, name):
# 实例属性
self.name = name
def introduce(self):
print('我是实例方法')
10.6 类属性、类方法、静态方法
10.6.1 类属性
# 类属性就是给类对象中定义的属性
# 通常用来记录这个类的相关特征
# 类属性不会去用于记录具体对象的特征
class Person:
# 在这里定义一个类属性用来去记录创建对象的次数
count = 0
def __init__(self, name):
self.name = name
# 类属性加1
Person.count += 1
p1 = Person('人员一')
p2 = Person('人员二')
p3 = Person('人员三')
# 使用类名.类属性进行访问
print(Person.count) # 3
# 访问类属性还可以使用对象.类属性(不推荐)
'''
原理是当你去访问的时候,他会在先在该对象中去查找,
如果有则输出,没有则向上查找创建他的类是否有该属性
'''
print(p1.count) # 3
print(p2.count) # 3
print(p3.count) # 3
# 用对象去访问类属性会产生问题例如下面的例子
p1.count = 99
print(p1.count) # 99
print(Person.count) # 3
'''
对p1.count进行修改为99,实际上它是去p1中去找是否有count这个
属性如果没有则创建count属性并且赋值为99,而不是向上去查找
'''
10.6.2 类方法
# 类方法顾名思义就是针对类定义的方法,类方法在内部可以直接访问类方法和类属性
class Teacher:
count = 0
def __init__(self, name):
self.name = name
@classmethod
def clsMethod(cls):
cls.count += 1
print(cls.count)
Teacher('Jack').clsMethod() # 1
10.6.3 静态方法
# 静态方法就是该方法不需要访问类属性,类方法,实例属性,实例方法
# 例如:我们玩游戏的时候有个帮助说明,它只需要输出文本
class Game:
def __init__(self,name):
self.name = name
@staticmethod
def help():
print('我是静态方法,帮助说明!')
Game.help() # 我是静态方法,帮助说明!
"""
总结:
- 在方法的内部,即需要访问实例属性,又要访问类属性,则使用实例方法
因为类只有一个,实例方法内部可以使用类名.类属性进行访问
- 在方法的内部,不需要访问类属性,类方法,实例属性,实例方法,则使用静态方法
- 在方法的内部,只需要访问类属性的,则使用类方法
"""
总结
以上就是今天要讲的内容,希望对大家有所帮助!!!