类与 对象
info
数据类自动生成常用的方法如__init__、__repr__等,减少样板代码,让开发者专注于业务逻辑。
from dataclasses import dataclass
@dataclass
class Person:
name: str
age: int
面向对象编程
面向对象编程——Object Oriented Programming,简称 OOP,是一种程序设计思想。OOP 把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
在 Python 中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。
面向对象的设计思想是从自然界中来的,因为在自然界中,类(Class)和实例(Instance)的概念是很自然的。
Class 是一种抽象概念,比如我们定义的 Class——印花T恤,是指印花T恤这个概念,而实例(Instance)则是一个个具体的印花T恤,比如,我手上的向日葵印花T恤和玫瑰印花T恤是两个具体的印花T恤。
所以,面向对象的设计思想是抽象出 Class,根据 Class 创建 Instance。
面向对象的抽象程度又比函数要高,因为一个 Class 既包含数据,又包含操作数据的方法。
class
python通过class关键字定义一个类,类如果不继承其他类,则默认继承object类,此时可以省略括号与object。
# class ClassName(object):
class ClassName:
"""class docstring"""
pass
instance = ClassName()
如果在定义时,括号内含有一个或多个其他类,那么这个类就继承了这些类?。
类继承的基本形式:
# class ClassName(ParentClass1, ParentClass2, ...):
class ClassName(ParentClass): # ParentClass 就是用来继承的父类
"""class docstring"""
# 类里的变量称为属性。
name = "ClassName"
# 类里的函数称为方法。
def method(self):
return
# 类被调用称为创建实例或实例化
# instance称之为ClassName类的实例。
instance = ClassName()
方法和属性
方法按照是否可访问实例和类的属性分为:
- 类方法:
@classmethod装饰器+第一个参数传入类(约定为cls) ,类或实例可以调用,能访问类的属性和方法。 - 静态方法:
@staticmethod装饰器,类或实例可以调用,不能访问实例和类和实例的属性和方法。 - 实例方法:约定第一个参数传入实例(约定为self),约定实例化后调用,可以访问实例的属性和方法。
tip
不遵守self和cls命名约定不会让你代码报错,但是遵守约定可以让你的代码可读性更高。
class ClassName:
def instance_method(is_not_self):
print("instance_method", is_not_self)
# 不遵守第一个参数传入实例的约定,可通过类调用。但是不能实例化后调用。
# 这种方法如果加上@staticmethod装饰器,既可以类调用,也可以实例化后调用。
def instance_method_no_self():
print("instance_method_no_self")
# 如果你通过类调用方法,那么它就是普通函数。如果有参数需要手动传入参数。
ClassName.instance_method_no_self() # instance_method_no_self
ClassName.instance_method(1) # instance_method 1
ClassName.instance_method(ClassName())# instance_method <__main__.ClassName object at 0x0000021973262280>
# 如果实例化后调用,那么它会自 动将实例作为第一个参数传入。如果方法没有参数则会报错。
ClassName().instance_method() # instance_method <__main__.ClassName object at 0x0000021973262280>
ClassName().instance_method_no_self() # TypeError: ClassName.instance_method_no_self() takes 0 positional arguments but 1 was given
方法和属性按照是否以下划线_开头和结尾,可以分为以下几种:
- 以 __ 开头和结尾的方法和属性,大多有特殊用途。称呼多样,称为 “special/双下划线/魔法” 方法和属性。