Python的类说明

Posted 昀溪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python的类说明相关的知识,希望对你有一定的参考价值。

概要

  1. 如何定义一个类
  2. 类里通常包含什么
  3. 各个部分解释

类结构

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: rex.cheny
# E-mail: [email protected]


# 类名后面写(object)这种写法表示是新式类,不写object是经典类,两种的区别是多继承的问题。
class OOP(object):

    # 定义类变量,类共享的,那么实例A修改以后实例B也会受到影响(修改不可比那对象感官上看不到修改,如果是可变类型比如列表,感官上就有影响了),
    # 所以类变量是定义共有的属性通常不能修改,虽然技术上也可以修改。不用实例化也可以访问类变量。
    var1 = "hello"  # 不可变对象
    list1 = []  # 可变对象

    def __call__(self, *args, **kwargs):
        """
        这个函数不是析构函数也不是构造函数,对象或者实例可以像函数一样调用,就像执行普通函数一样。这个如果不需要也不用写。
        :param args:
        :param kwargs:
        :return:
        """
        print("我是特殊函数 __call__")

    def __init__(self):
        """
        构造函数,用于初始化类的实例,实例化对象的时候就会自动调用这个方法,比如把实例变量绑定到实例上。
        这里这个self其实有些特别,也就是实例化的时候会自动把实例对象传递进来,self就是实例对象。
        oop = OOP() 这里其实是 OOP(oop) 所以self就是实例oop,这个self也就是为了接受隐式传递进来的实例名称
        除了在 __init__ 方法中定义的东西属于实例自己之外也就是在内存中也是独立的,其他的内容包括类变量、类里面的方法在内存中都只有一份所有
        实例公用。
        """

        # 在 __init__ 方法里定义的变量是实例变量,实例独享的。通过实例调用变量或者其他资源是先找实例本身,如果没有就找类的。
        # 比如类变量和实例变量同名,你通过实例访问这个变量时,它会给你返回实例变量的值。
        # 加 "_" 表示私有变量,不过使用 "_" 也可以通过某种方式直接访问,所以要想使用严格的私有变量要使用 "__" 双下划线。
        self._Var2 = ""
        print("我是构造函数 __init__")

    def __del__(self):
        """
        析构函数,当实例对象删除时候调用,所以不需要设置参数,你也传递不了参数。它是在实例销毁的时候自动调用的。
        对于python解释器来说,它有垃圾回收机制,只要有实例存在解释器就认为这个类被使用。如果你del这个实例,其实你删除的
        是这个实例,也就意味着切断了实例和类的关系,当解释器发现某个类没有被引用了就可以在内存中删除了。
        实例保存的是指向类的指针,实例放在栈里,类放在堆里。基本数据类型放在栈里,非基本数据类型真实的数据都是在堆里,而这个变量名在栈里。
        这个方法你通常不用写。
        """
        print("我是析构函数 __del__")

    def myMethod(self):
        """
        为什么类里面的每一个方法都是有self呢?因为我们调用的时候虽然是通过实例名称来调用,但是实际上是
        OOP.myMethod(oop)这种形式,你发现它还是会自动把实例传进来,这个self就是用来接收这个实例的。所以
        你在自己的方法里面可以访问变量。实例 oop 本身没有 myMethod()方法,之所以可以调用成功就是 OOP.myMonth(oop) 完成的。
        对于实例来说类里面的方法都是公用的,你实例化多个对象其实这些对象是多个,但是它们所公用的类方法和类变量在内存中也只有一份,
        哪个个实例调用这个方法那么这个self就是哪个实例。记住一句话实例调用方法都是对实例自身进程操作的。
        再说详细点,2个针对于同一个类的实例,A实例操作一个方法会影响B实例么?显然不能,这就是self必须存在的原因,在JAVA中也是一样,只是它使用this。
        :return:
        """
        print("自定义方法")


    # 设置成属性用于获取内部变量
    @property
    def Var(self):
        return self._Var2

    # 设置成属性形式赋值给内部变量,这个必须写在@property下面
    @Var.setter
    def Var(self, value):
        self._Var2 = value


def main():
    oop = OOP()
    oop1 = OOP()
    # 调用实例的 __call__函数
    oop()
    # 通过属性方式修改变量
    oop.Var = "world"
    print(oop.Var)
    # 判断是否有某种属性
    # print(hasattr(oop, "_var1"))

    # 修改不可变对象(类变量)
    print("通过实例oop查看类变量var1的值:", oop.var1)
    print("通过实例oop1查看类变量var1的值:", oop1.var1)
    print("通过实例oop修改类变量var1的值:改为100")
    oop.var1 = 100
    print("通过实例oop查看类变量var1的值:", oop.var1)
    print("通过实例oop1查看类变量var1的值:", oop1.var1)
    # 从值上看感觉类变量也属于实例,因为修改不影响,下面打印id你就看出来了
    # print("通过实例oop查看类变量var1的内存地址:", id(oop.var1))
    # print("通过实例oop1查看类变量var1的内存地址:", id(oop1.var1))
    # print("通过实例oop修改类变量var1的值:改为100")
    # oop.var1 = 100
    # print("通过实例oop查看类变量var1的内存地址:", id(oop.var1))
    # print("通过实例oop1查看类变量var1的内存地址:", id(oop1.var1))

    # 修改类变量可变类型变量
    print("oop实例向list1添加一个元素A")
    oop.list1.append("A")
    print("oop的 list1 内容为:", oop.list1)
    print("oop1的 list1 内容为:", oop1.list1)


if __name__ == __main__:
    main()

 

以上是关于Python的类说明的主要内容,如果未能解决你的问题,请参考以下文章

有条件地导入 python 类的片段

Python的类说明

Python的类变量和成员变量

如何将 View 类中的代码片段移动到 OnAppearing() 方法?

Python--面向对象的补充说明

扩展片段的类中的选项卡