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

小菜鸟的代码世界 2020-04-15

类属性和实例属性

定义:

实例属性:在实例对象中定义的属性
类属性: 在类对象中定义的属性,并且多个实例对象共享一份类属性
类属性使用方式:类名.类属性,也可以使用 对象.类属性
注意:
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 静态方法名([形参列表])
函数体

要点如下:
必须位于方法上面的一行
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.静态方法可以通过类对象调用

相关推荐