类就是拥有相同功能或者相同属性的对象的集合
对象就是类的实例
用代码来描述这个类是拥有那些相同功能和那些相同属性的对象的集合,功能使用函数来描述,属性使用变量来描述
(1)语法
class 类名:
类的说明文档
类的内容(包含方法和属性)
(2)说明
class → 关键字;固定写法
类名 → 由程序员自己命名
两个要求:是标识符,不是关键字
三个规范:见名知义;驼峰式命名(大驼峰);不使用系统函数名、类名或 者模块名
: → 固定写法
类的说明文档 → 本质就是多行注释
类的内容 → 类的内容包含方法(对象方法、类方法、静态方法)和属性(对象属 性、类属性)两种
方法:定义在类的函数中
属性:定义在类的变量中
语法:类名()→ 创建指定类的对象
(1)怎么定义:直接定义在类中的函数就是对象方法
(2)怎么调用:通过‘对象.xxx()’的方式来调用
(3)特点:有个默认参数self,在通过对象调用对象方法的时候self不需要传参,系统会自 动将对象传给self(谁调用self就指向谁)
class A:
# func1是对象方法
def func1(self):
print(self)
print('对象方法')
# 通过对象调用对象方法(给对象发消息)
a1 = A()
a1.func1()
# a1:<__main__.A object at 0x0000018B9AA36F70>
# a2:<__main__.A object at 0x0000018B9AA36EE0>
# <__main__.A object at 0x0000018B9AA36EE0>
# 对象方法
(1)怎么定义:定义函数前加装饰器:@classmethod
(2)怎么调用:通过‘类.xxx()’的方式来调用
(3)特点:有个默认参数cls,在通过类调用类方法的时候cle不需要传参,系统会自动将类 传给cls(谁调用cls就指向谁)
# func2是类方法
@classmethod
def func2(cls):
print(cls)
print('类方法')
# 通过类调用方法
A.func2()
# class '__main__.A'>
# 类方法
(1)怎么定义:定义函数前加装饰器@staticmethod
(2)怎么调用:通过‘类.xxx()’的方式来调用
(3)特点:没有有特点
# func3是静态方法
@staticmethod
def func3(a,b):
print('静态方法')
# 通过类调用静态方法
A.func3(10, 20) # 静态方法
类中方法名前后都有两个__的对象方法就是魔法方法。魔法方法不需要程序员调用,在特定的情况下会被自动调用
创建类的对象的时候系统会自动调用这个类中的__init__方法,来对创建好的对象进行初始化操作
创建类的对象的时候,需不需要参数,需要几个参数有__init__的参数决定
class B:
def __init__(self):
print('init')
b1 = B() # init
b2 = B() # init
定制当前类的对象的打印格式:这个方法的返回值是什么,打印这个类的对象的时候就是打印什么(返回值必须是字符串)
class point:
def __init__(self,x,y):
self.x = x
self.y = y
# 定制当前类的对象的打印格式:这个方法的返回值是什么,打印这个类的对象的时候就是打印什么(返回值必须是字符串)
def __repr__(self):
return f'x:{self.x},y:{self.y}'
p1 = point(10,20)
p2 = point(100,200)
print(p1)
print(p2)
(1)怎么定义:直接定义在类中的变量就是类属性
(2)怎么使用:通过‘类.xxx();
(3)什么时候用:如果属性值不会因为对象不同而不一样就定义成类属性
class C:
# x是类属性
x = 10
# 通过类使用类属性
print(A.x)
class Circle:
pi = 3.1415926
def __init__(self,r):
self.r = r
c1 = Circle(5)
c1 = Circle(10)
print()
(1)怎么定义:以’self.属性名 = 值‘的形式定义在__init__方法中
(2)怎么使用:通过对象使用对象属性 → 对象.xxx
(3)什么时候用:如果属性值会因为对象不同而不一样就定义成对象属性
# y是对象属性
def __init__(self):
self.y = 20
(1)给一个固定的值
(2)给一个没有默认值的参数
(3)给一个有默认值的参数
class Circle:
pi = 3.14
def __init__(self, r):
self.r = 1
def area(self):
# self = c1
# 在对象方法中通过self提供对象属性
return Circle.pi * self.r ** 2 # 3.14 * c1.r ** 2
c1 = Circle(10)
print(c1.r, c1.area())
继承就是让子类直接拥有父类的所有属性和方法
class 类名(父类1,父类2,父类3,…):
类的说明
类的内容
注意:object类是python的基类,python中所有的类都是直接或者间接继承自object的
(1)添加类属性和方法 → 直接在子类中定义类属性和方法
class Person:
num = 61
def __init__(self):
print('Person的__init__')
self.name = '小明'
self.age = 18
self.gender = '男'
def eat(self):
print('吃饭')
class Student(Person):
x = 199
def __init__(self):
super().__init__() # 调用当前类的父类的__init__方法
print('Student的__init__')
self.study_id = '001'
# 添加study方法
def study(self):
print('学习')
# 重写eat方法
def eat(self):
# super().eat()
print('吃食堂')
print(Student.num, Student.x)
stu = Student()
stu.eat()
stu.study()
print(stu.name, stu.age, stu.gender)
print(stu.study_id)
from datetime import datetime, date
(2)添加对象属性 → 必须在子类的__init__方法中通过‘super()’取调用父类的__init__方法
类中的方法的调用过程:通过类或者对象调用的方法的时候,会先看当前这个类中有没有对应的方法,如果有直接调用,没有就看父类是否 有,父类也没有就找父类的父类…知道找到object类中也没有就报错
class D:
# 给类属性__slots__赋值,是用来约束当前类只能拥有哪些对象属性。元组中的元素就是属性名
__slots__ = 'x', 'y', 'm', 'n'
def __init__(self):
self.x = 10
self.y = 20
self.m = 30
@property # 这是一个装饰器,可以让我调用下面这个方法的时候不用加()
def func1(self):
print('函数func1')
d1 = D()
d1.func1
d1 = date(2000, 3, 5)
print(d1.year)
print(d1.month)
print(d1.day)
class M:
def __init__(self, a, b=1):
# a=200,b=1
self.a = a # self.a=200
self.b = b # self.b=1
self.c = 10
class N(M):
def __init__(self, x, a, b=1):
# self=n1, x=100, a=200, b=1
super().__init__(a, b)
self.x = x # self.x=100
n1 = N(100, 200) #
print(n1.a, n1.b, n1.c, n1.x)