类
定义类
- 所有类名首字母要求大写,多个单词时遵循驼峰命名法
- 所有未定义父类的类都继承object
格式:class 类名[(父类)]:
#两种方式意思相同
class Person:
pass
class Person(object):
pass
定义类和属性
name、age、subject就是类属性
class Student:
#类属性
name = ''
age = 0
subject = []
类中方法
对象方法(普通方法)
格式:
def 方法名(self[,parm1,parm2...]):
pass
self就是对象本身
class Student:
# 类属性
name = 'student'
age = 0
subject = []
# 普通方法
def study(self):
print(self.name, '正在学习...')
xiaoming = Student()
xiaoming.name = 'xiaoming'
xiaoming.study()
------------
输出:
xiaoming 正在学习...
class Student:
# 类属性
name = 'student'
age = 0
subject = []
# 普通方法
def study(self, name):
print(name, '正在学习...')
s1 = Student()
s1.study('xiaohong')
----------------
输出:
xiaohong 正在学习...
类方法
格式:
@classmethod
def 方法名(cls):
pass
- 类方法使用@classmethod装饰器
- 对象方法传入的是self,类方法传入的是cls
- 类方法可以直接用类调用,或者可以用类的实例(对象)调用
class Dog:
dog_type = '阿拉斯加'
def __init__(self, nickname):
self.name = nickname
def dog_run(self):
print('{}在公园里跑.看起来是一只{}.'.format(self.name, self.dog_type))
@classmethod
def dog_sit(cls):
print(cls.dog_type, '很乖,坐下了')
dog1 = Dog('肉丸')
dog1.dog_type = '小泰迪'
dog1.dog_run()
Dog.dog_sit()
--------------
输出:
肉丸在公园里跑.看起来是一只小泰迪.
阿拉斯加 很乖,坐下了
静态方法
- 静态方法使用装饰器@staticmethod
- 静态方法没有参数
- 当方法跟类属性和对象属性都没有关系的时候,使用静态方法
- 支持对象和类名直接调用
class Dog:
def __init__(self, nickname):
self.name = nickname
@staticmethod
def dog_sit():
print('很乖,坐下了')
dog1 = Dog('肉丸')
dog1.dog_sit()
Dog.dog_sit()
---------------------
输出:
很乖,坐下了
很乖,坐下了
魔术方法
格式:
def __方法名__(self):
pass
__init__() 初始化函数
- 如果没有__init__。直接利用类向内存申请一个和类一样的空间,给到对象。
- 如果有__init__。利用类向内存申请一个和类一样空间,内存空间(self)传递给__iniy__,执行__init__的函数。最后将内存空间给到对象。
__new__()构造函数
class Robot():
def __init__(self, name):
print('---init阶段---')
print('给机器人一个自己的名字')
self.name = name
print('机器人:', self.name)
print('查看内存地址:', self)
def __new__(cls, *args, **kwagrs):
print('---构造一个机器人对象---')
result = super().__new__(cls)
print('构造成功')
print('查看开辟的内存地址:', result)
return result
robot1 = Robot('小P')
----------------
输出:
---构造一个机器人对象---
构造成功
查看开辟的内存地址: <__main__.Robot object at 0x000002069F7938C8>
---init阶段---
给机器人一个自己的名字
机器人: 小P
查看内存地址: <__main__.Robot object at 0x000002069F7938C8>
- __new__()构造函数会先于__init__()初始化函数执行,无论编写顺序。__new__()会构建类,开辟内存地址然后传给__init()
- 我们创建一个类的时候,虽然我们没有写,但是系统会首先调用__new__()构造函数
关于__new()__构造函数使用场景和更多解析,我们单独用一篇博客去探索。
__call__()
将对象当作函数时,调用__call__()
class Robot():
def __call__(self):
print('调用__call__')
robot1 = Robot()
robot1()
------------------
输出:
调用__call__
__del__()析构函数
触发时机:当对象在内存中被销毁时,会被执行。(整个程序执行结束;函数执行结束;主动del删除对象)
作用:在对象被销毁时,执行一些操作。
import time
class Robot():
# 析构函数
def __del__(self):
print('---这是一个析构函数---')
def fx():
robot1 = Robot()
print('此函数将要睡2秒')
for i in range(1, 3):
print('第{}秒'.format(i))
time.sleep(1)
fx()
print('函数执行结束')
------------
输出:
此函数将要睡2秒
第1秒
第2秒
---这是一个析构函数---
函数执行结束
__str__()
正常情况下,实例化对象后打印对象,会返回对象的内存地址。但是这个对于开发者来说没有实际的意义,获取不到更多信息。
class Robot():
def __init__(self):
self.name = '擎天柱'
robot1 = Robot()
print(robot1)
--------------
输出:
<__main__.Robot object at 0x0000014C20ED4FC8>
可以用__str__()输出有用的信息
class Robot():
def __init__(self):
self.name = '擎天柱'
def __str__(self):
return '这是一个机器人对象,非常无敌'
robot1 = Robot()
print(robot1)
----------
输出:
这是一个机器人对象,非常无敌
对象
创建对象
格式:对象名 = 类名()
class Student:
#类属性
name = ''
age = 0
subject = []
xiaoming = Student()
对象属性
- 当创建了对象时,对象会继承类的属性。获取属性的时候,也是从类中获取属性。
- 当对默认的类属性赋值后(对象名.属性 = xxxx),属性才会变成对象属性。
class Student:
# 类属性
name = 'student'
age = 0
subject = []
xiaoming = Student()
print('类属性:', xiaoming.name) # 此时是从类中获取的类属性
xiaoming.name = 'xiaoming' # 因为赋值了,此时变成了对象属性
print('对象属性:', xiaoming.name)
-------------
输出:
类属性: student
对象属性: xiaoming