• 类属性和实例化属性


    类的构成包括成员属性和成员方法(数据成员和成员函数)
    类的方法,有这么几个种:类方法、静态方法和实例方法。
    类的属性也分为两种:一种是实例化属性,一种是类属性。

    类的方法

    类方法:

    @classmethod # 类方法 需要cls参数,代表调用该函数的类.一般是用来访问类属性的

    静态方法

    @staticmethod # 静态方法:静态方法只在内存中生成一个,节省开销(也叫类的工具包)。

    实例方法

    def f3(self): # 实例方法需要self参数,代表调用该函数的实例

    类属性

    类属性对于所有的实例是公用的,与实例无关,一般定义在类中方法以外,当然类属性也可以定义在方法内的,
    类属性是定义在类层面的,因此类属性要比实例属性作用域范围要广一些。

    实例属性是与实例绑定的,只与实例有关,在类层次上是看不到的,

    定义在类实例方法内。实例属性使用实例对象定义,而且对于每个实例化对象都是独立存在的。

    在方法中定义的属性与方法外定义的属性略有不同。在方法外定义的类属性(count、lst),
    只要类定义完成就已经生成;而在方法内定义的类属性,需要调用方法之后才会生成。也就是要实例化


    使用类名称修改类属性

    使用类名称修改类属性之后,不管用类名称还是实例名称调用类属性,
    都是一样的,说明修改的的确是类属性。

    使用类的实例化对象修改类属性

    可变类型可修改,不可变类型不可修改

    """
    类的构成包括成员属性和成员方法(数据成员和成员函数)
    类的方法,有这么几个种:类方法、静态方法和实例方法。
    类的属性也分为两种:一种是实例化属性,一种是类属性。
    """
     # 定义一个类
    class MyClass:
        i = "MyClass类属性 i"
        def __init__(self):
            self.i='实例化属性 i'
        @classmethod # 类方法 需要cls参数,代表调用该函数的类.一般是用来访问类属性的
        def f1(cls):
            return cls.i
        @staticmethod # 静态方法:静态方法只在内存中生成一个,节省开销(也叫类的工具包)。
        def f2(i): 
            return i
        def f3(self): # 实例方法需要self参数,代表调用该函数的实例
            return self.i
    # 定义另一个类
    class b:
        i="class b 的类属性"
        def f1(self):
            return self.i
    # 实例化类
    x = MyClass() # 实例方法
    # 方法调用效果
    print("MyClass 类的方法 f1 输出为:", MyClass.f1())
    print("MyClass 类的方法 f1 输出为:", x.f1())
    print("MyClass 类的方法 f2 输出为:", MyClass.f2(2))
    print("MyClass 类的方法 f2 输出为:", x.f2(5))
    print("MyClass 类的方法 f3 输出为:", x.f3())
    print("MyClass 类的方法 f3 输出为:", MyClass.f3(x))
    # 鸭子类型的表现
    print("MyClass 类的方法 f3 输出为:", MyClass.f3(b))
    print("   b    类的方法 f1 输出为:", b.f1(MyClass)) 
    print("   b    类的方法 f1 输出为:", b.f1(x)) 
    
    
    # 类的属性
    class C:
        """
        变量 x 和 words 是实例属性
        count、lst、say是类属性。
        """
        count=0
        lst=[1,2,3]
        def __init__(self, num = 0):
            self.x = num
            C.count += 1
            if C.count>3:
                C.say="好多实例对象啊!"
            else:
                C.say="实例对象好孤单啊!"
        def fprint(self,string):
            self.words=string
            print(self.words) 
    
    # 实例属性是与实例绑定的,只与实例有关,在类层次上是看不到的,
    # 定义在类实例方法内。实例属性使用实例对象定义,而且对于每个实例化对象都是独立存在的。
    a = C(5)
    a.x # 5
    a.fprint("a说,我是第一个实例对象")
    a.words
    
    # 每个实例化对象的属性都是独立的
    c = C()
    c.x # 0
    c.y =2
    c.y # 2
    # a.y # 'C' object has no attribute 'y'
    
    # 类属性
    """
    类属性对于所有的实例是公用的,与实例无关,一般定义在类中方法以外
    当然类属性也可以定义在方法内的,
    类属性是定义在类层面的,因此类属性要比实例属性作用域范围要广一些。
    这里, count 和 lst 就是直接定义在类中方法以外的类属性,类属性通过类名调用。
    """
    # 直接使用类名称调用类属性
    C.lst # [1,2,3]
    C.count # 3
    C.say
    print("实例调用与类名调用属性")
    d = C(1) # # 实例化之后原来的属性值改变
    d.say 
    C.say
    """
       在方法中定义的属性与方法外定义的属性略有不同。在方法外定义的类属性(count、lst),
       只要类定义完成就已经生成;而在方法内定义的类属性,需要调用方法之后才会生成。也就是要实例化
    """
    
    # 使用类名称修改类属性
    """
    使用类名称修改类属性之后,不管用类名称还是实例名称调用类属性,
    都是一样的,说明修改的的确是类属性。
    """
    C.count = 9
    c.lst[1] = 5
    C.count
    C.lst
    
    # 使用类的实例化对象修改类属性
    # 可变类型可修改,不可变类型不可修改
    

    参考类属性(方法)和类实例化属性(方法)

    努力拼搏吧,不要害怕,不要去规划,不要迷茫。但你一定要在路上一直的走下去,尽管可能停滞不前,但也要走。
  • 相关阅读:
    Python调用sqlAlchemy
    Docker容器管理及代码调用
    Spring设置动态定时任务
    多数据源实现读写分离
    Spring整合EHCache框架
    springBoot整合Redis
    初探Mybaties整合分页插件PageHelper(1)
    流程控制,循环结构,for,while循环
    变量,常量,格式化输入输出,运算符
    编程语言介绍,变量介绍
  • 原文地址:https://www.cnblogs.com/wkhzwmr/p/15100401.html
Copyright © 2020-2023  润新知