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、实例方法, 类方法, 静态方法, 函数 

    不想访问 类内 和 实例内 的变量,用静态方法

    只想访问类内变量,不想访问实例变量(初始化属性),用类方法

    既要访问内变量,也想访问实例变量用实例方法

    函数与静态方法相同,只是静态方式的作用域定义在类内

posted @ 2020-12-29 16:12  昱成  阅读(127)  评论(0编辑  收藏  举报