• Python3.x基础学习-类--类属性和实例属性


    类属性和实例属性

    定义:

    实例属性:在实例对象中定义的属性
    类属性: 在类对象中定义的属性,并且多个实例对象共享一份类属性
    类属性使用方式:类名.类属性,也可以使用 对象.类属性
    注意:
    1.不可变类型:对象名。属性名=属性值 是给对象添加属性,而不是进行修改
    2. 可变类型:如果对象是修改可变数据类型变量中的数据,是真正的修改如果是重新给可变数据类型变量赋值,这是给该对象添加属性

    class Dog:
        pass
    
    dog=Dog
    
    dog.name = '旺财'
    print(dog.name)
    dog.name = '大黄'
    print(dog.name)
    
    
    class Course:
        language = "Chinese"
        course = ['Python']
        def money(self):
            print('败家')
    
    print(id(Course))
    #类属性可以通过类对象和实例对象调用
    print(Course.language,Course.course)  #类名.类属性
    
    python = Course()
    
    print(python.course,python.language)   #对象名.类属性
    
    # 添加实例属性
    
    python.time = 20
    
    print(python.time)
    
    # print(Course.time)  #实例属性只能通过实例对象进行调用,不可以通过类对象调用

    不可变类型:对象名.属性名=属性值 是给对象添加属性值,而不是进行修改
    修改类属性,可以通过类对象修改

    print(Course.language) #Chinese
    Course.language = "python"
    print(Course.language)
    
    python = Course()
    python.language = 'I love python'  # 是给对象添加属性,而不是进行修改
    print(python.language)
    
    print(Course.language)

    可变类型:如果对象是修改可变数据类型变量中的数据,是真正的修改
    如果是重新给可变数据类型变量赋值,这是给该对象添加属性

    print(Course.course)
    # 修改可变类型的类属性  类对象.属性名
    Course.course.append('java')
    print(Course.course)
    
    python = Course()
    python.course.append('C')
    print(python.course,Course.course)
    
    python.course = ['python','C++']   #给该对象添加属性
    print(python.course)   #['python', 'C++']
    print(Course.course) # 类属性并没有修改['Python', 'java', 'C']
    
    python.money()
    Course.money(Course)

    类可以调用实例方法、静态方法、类方法和类属性,但是不能调用实例属性
    实例对象可以调用实例方法、类方法、静态方法、类属性和实例属性

    实例对象能调用所有的方法和属性
    而类除了不能调用实例属性,其他方法和属性都能够调用

    class Classname:
        @staticmethod
        def fun():
            print('静态方法')
    
        @classmethod
        def a(cls):
            print('类方法')
    
        # 普通方法
        def b(self):
            print('普通方法')
    
    
    
    Classname.fun()
    Classname.a()
    # Classname.b()
    
    C = Classname()
    C.fun()
    C.a()
    C.b()

    静态方法

    Python 中允许定义与”类对象“无关的方法,称为”静态方法“
    静态方法和模块中定义普通函数没有区别,只不过静态方法放到了类的名字空间里面,需要通过类调用

    静态方法通过装饰器@staticmethod 来定义。格式
    @staticmethod
    def 静态方法名([形参列表])
    函数体

    要点如下:
    1.@staticmethod必须位于方法上面的一行
    2.调用静态方法格式:类名.静态方法名(参数列表)
    3.静态方法中访问实例属性和实例方法会导致错误

    class Student:
        company = 'SXT'
    
        @staticmethod
        def add(a,b):
            print('{0}+{1}={2}'.format(a,b,(a+b)))
            return a+b
    
    Student.add(20,30)
    
    a = Student()
    a.add(1,2)
    
    __metaclass__ = type
    
    
    class Tst:
        name = 'tst'
        data = 'this is data'
        # 普通方法
        def normalMethod(self, name):
            print(self.data, name)
        # 类方法,可以访问类属性
        @classmethod
        def classMethod(cls, name):
            print(cls.data, name)
        # 静态方法,不可以访问类属性
        @staticmethod
        def staticMethod(name):
            print(name)
    
    
    tst = Tst()
    tst.data = 'this is new'
    tst.normalMethod('name')
    tst.staticMethod('name')
    tst.classMethod('name')
    
    print('------------------------------------')
    # error普通方法必须通过实例调用
    # Tst.normalMethod('name')
    Tst.classMethod('name')
    Tst.staticMethod('name')

    普通方法、类方法和静态方法区别

    普通方法
    1.普通方法可以访问实例属性和类属性
    2.普通方法不可以通过类对象调用
    类方法
    1.类方法可以访问类属性,不能访问实例属性
    2.类方法可以通过类对象调用
    静态方法
    1.静态方法不可以访问类属性,不可以访问实例属性
    2.静态方法可以通过类对象调用

  • 相关阅读:
    Uva 11991 Easy Prblem from Rujia Liu ?
    BANK && IT
    随机数发生器(对拍)-----对比测试
    HDU 1695(GCD)
    欧拉定理与费马定理,离散对数定理
    POJ 2352 (stars)
    线段树
    codeforces 51C(Three Base Stations)
    codeforces 165B(Burning Midnight Oil)
    POJ 2785(4 Values whose Sum is 0)
  • 原文地址:https://www.cnblogs.com/johnsonbug/p/12702702.html
Copyright © 2020-2023  润新知