python 类相关方法定义
类变量、实例方法、实例属性、初始化方法、类方法、静态方法
1、类变量
类变量是类的属性,此属性属于类,不属于此类的实例
作用: 通常用来存储该类创建的对象的共有属性
注:
【1】类变量可以通过该类直接访问
【2】类变量可以通过类的实例直接访问
【3】类变量可以通过此类的对象的__class__属性间接访问
【4】类的实例方法访问类变量要用 【self.变量名】访问
【5】类方法访问类变量要用【cls.变量名】访问
In [141]: class A:
...: v = 0
...:
...: @classmethod
...: def get_v(cls): # cls 用来绑定调用此方法的类
...: return cls.v # 访问类变量
...:
...: @classmethod
...: def set_v(cls, value):
...: cls.v = value
...:
...:
...: print(A.get_v()) # 0 ,【1】通过类访问变量v
...: A.set_v(100)
...: print(A.get_v()) # 100
...: a1 = A() # 创建实例
...: print("a1.get_v() =", a1.get_v()) # 100
...: a1.set_v(200)
...: print("a1.get_v() =", a1.get_v()) # 200
...: print(a1.v) #200,【2】通过类的实例访问变量 v
...: print(a1.__class__.v) # 200 ,【3】通过类的__class__属性间接访问变量v
...: print('A.get_v() =', A.get_v())
0
100
a1.get_v() = 100
a1.get_v() = 200
200
200
A.get_v() = 200
2、【实例方法】
用于描述一个对象的行为,让此类型的全部对象都拥有相同的行为
【1】 实例方法实质是函数,是定义在类内的函数
【2】 实例方法至少有一个形参有,第一个形参代表调用这个方法的实例,一般命名为 'self'
【实例方法调用】
【1】实例.实例方法名(调用传参) #调用传参,调用实例方法需要传递的参数
【2】类名.实例方法名(实例,调用传参)
class 类名(继承列表):
def 实例方法名(self, 参数1, 参数2, ...):
'文档字符串'
pass
In [143]: # 此示例示意实例方法的创建和调用
...: class Dog:
...: '''这是一种小动物的定义
...: 此类动物有吃(eat)的行为:
...:
...: '''
...: def eat(self, food):
...: '''此方法用来描述小狗吃的行为'''
...: print("小狗正在吃:", food)
...:
...: def sleep(self, hour):
...: print("小狗睡了%d小时" % hour)
...:
...: def play(self, obj):
...: print("小狗正在玩:", obj)
...:
...:
...: dog1 = Dog() # 调用构造函数创建一个实例对象 再用dog1变量绑定
...: dog1.eat('骨头') #【1】实例.实例方法名(调用传参)
...: dog1.sleep(1)
...: dog1.play('球')
...: dog3 = Dog()
...: Dog.eat(dog3,"东西") #【2】类名.实例方法名(实例,调用传参)
...:
...: dog2 = Dog() # 创建另一个实例对象
...: dog2.eat('包子')
...: dog2.sleep(3)
...: dog2.play('篮球')
小狗正在吃: 骨头
小狗睡了1小时
小狗正在玩: 球
小狗正在吃: 东西
小狗正在吃: 包子
小狗睡了3小时
小狗正在玩: 篮球
3、【实例属性】
每个实例对象可以有自己的变量,称为实例变量(也叫属性)
【作用】记录每个对象自身的数据
实例.属性名 = xxx
赋值规则:在类的外部创建或者实例方法内或者初始化方法内
【1】首次为属性赋值则创建此属性
【2】再次为属性赋值则修改属性的绑定关系
In [145]: # 此示例示意属性的用法
...: class Dog:
...: def eat(self, food):
...: # print("小狗正在吃:", food)
...: print(self.color, '的', self.kinds, '正在吃', food)
...:
...: dog1 = Dog()
...: dog1.kinds = '京巴' # 为dog1对象添加kinds属性,绑定为'京巴'
...: dog1.color = '白色' # dog1添加属性 为'白色'
...: dog1.color = '黄色' # 改变dog1的color属性
...: print(dog1.color, "的", dog1.kinds) # 访问dog1 的属性
...:
...: dog2 = Dog()
...: dog2.kinds = '哈士奇'
...: dog2.color = '黑白相间'
...: print(dog2.color, '的', dog2.kinds) # 出错
...:
...: dog1.eat('骨头')
...: dog2.eat('窝头')
黄色 的 京巴
黑白相间 的 哈士奇
黄色 的 京巴 正在吃 骨头
黑白相间 的 哈士奇 正在吃 窝头
In [144]: # 此示例示意属性的用法
...: class Dog:
...: def eat(self, food):
...: # print("小狗正在吃:", food)
...: print(self.color, '的', self.kinds, '正在吃', food)
...: # 让调用此方法的对象添加一个last_food属性用来记住吃的信息
...: self.last_food = food
...:
...: dog1 = Dog()
...: dog1.kinds = '京巴' # 为dog1对象添加kinds属性,绑定为'京巴'
...: dog1.color = '白色' # dog1添加属性 为'白色'
...:
...: dog2 = Dog()
...: dog2.kinds = '哈士奇'
...: dog2.color = '黑白相间'
...:
...: dog1.eat('骨头')
...: dog2.eat('窝头')
...: print("dog1上次吃的是:", dog1.last_food)
...: print("dog2上次吃的是:", dog2.last_food)
白色 的 京巴 正在吃 骨头
黑白相间 的 哈士奇 正在吃 窝头
dog1上次吃的是: 骨头
dog2上次吃的是: 窝头
4、【初始化方法】
对新创建的对象添加属性
【1】 初始化方法名必须为 '__init__' 不可改变
【2】 初始化方法会在构造函数创建实例后自动调用,
且将实例自身通过第一个参数self 传入 __init__ 方法
#构造函数:类名()
【3】 构造函数的实参将通过__init__方法的参数列表传入到 '__init__' 方法中
【4】 初始化方法内如果需要return 语句返回,则只能返回None
class 类名(继承列表):
def __init__(self [, 形参列表]): # [] 表示其可以省略
pass
In [114]: class Car:
...: '''定义一个汽车类'''
...: def __init__(self, c, b, m):
...: self.color = c # 颜色
...: self.brand = b # 品牌
...: self.model = m # 型号
...: print("__init__方法被调用")
...:
...: def run(self, speed):
...: print(self.color, '的', self.brand,
...: self.model, '正在以',
...: speed, '公里/小时的速度行驶')
...:
...:
...: a4 = Car('红色', '奥迪', 'A4') # 调用构造函数
__init__方法被调用
In [113]: class Car:
...: '''定义一个汽车类'''
...: def __init__(self, c, b, m):
...: self.color = c # 颜色
...: self.brand = b # 品牌
...: self.model = m # 型号
...: print("__init__方法被调用")
...:
...: def run(self, speed):
...: print(self.color, '的', self.brand,
...: self.model, '正在以',
...: speed, '公里/小时的速度行驶')
...:
...:
...: a4 = Car('红色', '奥迪', 'A4') # 调用构造函数
...: a4.run(299)
...:
...: s3 = Car('蓝色', 'TESLA', 'Model S')
...: s3.run(270)
...:
__init__方法被调用
红色 的 奥迪 A4 正在以 299 公里/小时的速度行驶
__init__方法被调用
蓝色 的 TESLA Model S 正在以 270 公里/小时的速度行驶
5、【析构方法】
实际应用???后续补充
析构方法在对象被销毁时被自动调用 python建议不要在对象销毁时做任何事情,因为销毁的时间难以确定
class 类名:
def __del__(self):
pass
In [148]: class Car:
...: def __init__(self, name):
...: self.name = name
...: print("汽车", name, '被创建')
...:
...: def __del__(self):
...: '''析构方法,此方法会在对象销毁时自动被调用'''
...: print('汽车', self.name, '被销毁')
...:
...:
...: c1 = Car('BYD 汉')
...: c2 = c1
...: del c1 # 此时是删除c1变量,同时解除c1绑定的对象的引用
...:
...: input("请按回车键结束程序的执行!")
汽车 BYD 汉 被创建
汽车 BYD 汉 被销毁
请按回车键结束程序的执行!
Out[148]: ''
6、类方法@classmethod
类方法是用于描述类的行为的方法,类方法属于类,不属于类的实例
说明:
类方法需要使用@classmethod装饰器定义
类方法至少有一个形参,第一个形参用于绑定类,约定写为'cls'
类和该类的实例都可以调用类方法
类方法不能访问此类创建的实例的属性,不能访问初始化方法初始化的属性
In [149]: # 此示例示意类方法的使用
...: class A:
...: v = 0
...:
...: @classmethod
...: def get_v(cls): # cls 用来绑定调用此方法的类
...: return cls.v # 访问类变量
...:
...: @classmethod
...: def set_v(cls, value):
...: cls.v = value
...:
...:
...: print(A.get_v()) # 0
...: A.set_v(100)
...: print(A.get_v()) # 100
...: a1 = A() # 创建实例
...: print("a1.get_v() =", a1.get_v()) # 100
...: a1.set_v(200)
...: print("a1.get_v() =", a1.get_v()) # 200
...: print('A.get_v() =', A.get_v())
...:
0
100
a1.get_v() = 100
a1.get_v() = 200
A.get_v() = 200
7、静态方法 @staticmethod
静态方法是定义在类内部的函数,此函数的作用域是类的内部
说明:
静态方法需要使用 @staticmethod装饰器定义
静态方法与普通函数定义相同,不需要传入self实例参数和cls参数
静态方法只能凭借该类或类创建的实例调用
静态方法不能访问类变量和实例变量(属性)
In [153]: class A:
...: @staticmethod
...: def myadd(a, b):
...: return a + b
...:
...:
...: print(A.myadd(100, 200)) # 300
...: a = A() # 创建实例
...: print(a.myadd(300, 400)) # 700
300
700
def myadd(a, b):
return a + b
class A:
pass
print(myadd(100, 200)) # 300
print(myadd(300, 400)) # 700
8、实例方法, 类方法, 静态方法, 函数
不想访问 类内 和 实例内 的变量,用静态方法
只想访问类内变量,不想访问实例变量(初始化属性),用类方法
既要访问内变量,也想访问实例变量用实例方法
函数与静态方法相同,只是静态方式的作用域定义在类内