语法

说明

  • 类名一般采用驼峰命名,一般会约定类名首字母大写
  • __init__也叫构造函数,创建对象时被调用,也可以省略
  • self变量绑定的是被创建的对象,名称可以随意

定义类

class 类名:
    """
    文档说明
    """
    def __init__(self,参数):
        self.实例变量 = 参数

    方法成员

实例化对象

  • 变量存储的是实例化后的对象地址
  • 类名后面的参数按照构造函数的形参传递
class Wife:
    """
    自定义老婆类
    """
    # 数据
    def __init__(self, name, age, sex):
        # 初始化对象数据
        self.name = name
        self.age = age
        self.sex = sex

    # 行为(方法=函数)
    def play(self):
        print(self.name, "玩耍")

# 调用构造函数(__init__)
shang_er = Wife("双儿", 26, "女")
# 操作对象的数据
shang_er.age += 1
print(shang_er.age)
# 调用对象的函数
shang_er.play()# 通过对象地址调用方法,会自动传递对象地址.
# play(shanger)
print(shang_er)# <__main__.Wife object at 0x7f390e010f28>

实例成员

实例变量

说明

  • 首次通过对象赋值为创建,再次赋值为修改
  • 通常在构造函数__init__中创建
  • 每个对象存储一份,通过对象地址访问
  • __dict__对象的属性,用于存储自身实例变量的字典
lili = Wife()
lili.name = "丽丽"
lili.name = "莉莉"

lili2 = Wife("丽丽",24)
print(lili2.name)

实例方法

说明

  • 至少有一个形参,第一个参数绑定调用这个方法的对象,一般命名为self。
  • 无论创建多少对象,方法只有一份,并且被所有对象共享。
#定义
def 方法名称(self, 参数):
    方法体

#调用
# 不建议通过类名访问实例方法
对象.方法名称(参数)

演示

class Wife:
    def __init__(self, name):
        self.name = name
    def print_self(self):
        print("我是:", self.name)

lili = Wife("丽丽") # dict01 = {"name":"丽丽"}
lili.name = "莉莉" # dict01["name"] = "莉莉"
print(lili.name) # print(dict01["name"])
lili.print_self()
print(lili.__dict__) # {"name":"丽丽"}

"""
# 支持动态创建类成员
# 类中的成员应该由类的创造者决定
class Wife:
    pass

w01 = Wife()
w01.name = "莉莉"
print(w01.name)#对象.变量名
"""

"""
# 实例变量的创建要在构造函数中__init__
class Wife:
    def set_name(self,name):
        self.name = name

w01 = Wife()
w01.set_name("丽丽")
print(w01.name)
"""

跨类调用

写法1:直接创建对象

# 语义:老张每次创建一辆新车去
class Person:
    def __init__(self, name=""):
        self.name = name

    def go_to(self,position):
        print("去",position)
        car = Car()
        car.run()

class Car:
    def run(self):
        print("跑喽~")

lz = Person("老张")
lz.go_to("东北")

写法2:在构造函数中创建对象

# 语义:老张开自己的车去
class Person:
    def __init__(self, name=""):
    self.name = name
    self.car = Car()

def go_to(self,position):
    print("去",position)
    self.car.run()

class Car:
    def run(self):
        print("跑喽~")

lz = Person("老张")
lz.go_to("东北")

方式3:通过参数传递

# 语义:老张用交通工具去
class Person:
    def __init__(self, name=""):
        self.name = name
    def go_to(self,vehicle,position):
        print("去",position)
        vehicle.run()

class Car:
    def run(self):
        print("跑喽~")

lz = Person("老张")
benz = Car()
lz.go_to(benz,"东北")

类成员

类变量

#在类中,方法外
class 类名:
    变量名 = 数据

#调用
类名.变量名
# 不建议通过对象访问类变量

特点

  • 随类的加载而加载
  • 存在优先于对象
  • 只有一份,被所有对象共享
  • 描述所有对象的共有数据

类方法

#定义
@classmethod
def 方法名称(cls,参数):
    方法体

#调用
类名.方法名(参数)
# 不建议通过对象访问类方法

说明

  • 至少有一个形参,第一个形参用于绑定类,一般命名为'cls'
  • 使用@classmethod修饰的目的是调用类方法时可以隐式传递类。
  • 类方法中不能访问实例成员,实例方法中可以访问类成员。

演示:支行与总行钱的关系

class ICBC:
    """
        工商银行
    """
    # 类变量:总行的钱
    total_money = 1000000
    # 类方法:操作类变量
    @classmethod
    def print_total_money(cls):
        # print("总行的钱:", ICBC.total_money)
        print("总行的钱:", cls.total_money)

    def __init__(self, name,money=0):
        self.name = name
        # 实例变量:支行的钱
        self.money = money
        # 总行的钱因为创建一家支行而减少
        ICBC.total_money -= money

ttzh = ICBC("天坛支行",100000)
xdzh = ICBC("西单支行",200000)
# print("总行的钱:", ICBC.total_money)
ICBC.print_total_money()

静态方法

# 定义
@staticmethod
def 方法名称(参数):
    方法体

#调用
类名.方法名称(参数)
# 不建议通过对象访问静态方法

说明

  • 使用@staticmethod修饰的目的是该方法不需要隐式传参数
  • 静态方法不能访问实例成员和类成员
  • 定义常用的工具函数