python从零开始--24 类属性 VS 实例属性

类属性的定义方法:在类里面但不在类的方法里定义;不带self。

类属性的访问方法:A)用类访问的格式 “类名.类属性”; 

                              B) 用实例对象访问 "实例对象名.类属性"


实例属性的定义方法有两种: A) 一种是在类方法中定义,带self,尽量在__init__中定义和初始化; 

                                            B) 一种是实例对象生成后,在实例对象名称后“ .XXX”来给该对象添加一个实例属性。 注意添加的实例属性千万不要与其类属性同名,实例属性会覆盖类属性, 让程序的可读性和可维护性变的很差。

实例属性的访问方法: A)  在方法定义中,用 "self.实例属性"

                                     B)  在类定义外部,用 "实例对象名.实例属性"


类属性的定义和访问方法示例:

class Student():
    student_count = 0 # 类属性的定义和初始化 

    def __init__(self, input_name):
        self.name = input_name  # 这个name,前面带self,是实例属性,self就是指实例对象,实例对象最好在__init__中声明并初始化
        Student.student_count += 1 # 这里用“类名.类属性”调用类属性,实现每生成一个Student对象,student_count自增1

    def print_info(self):
        stu_info = "光谷实验中学学生:" + self.name  # 这个stu_info是方法print_info的局部变量,不是类属性
        print(stu_info)


s1 = Student("李浩")
s2 = Student('张淼')
s3 = Student('珊琳')
s3.print_info()
print("用实例对象访问student_count,已创建的Student实例对象数为 {}".format(s3.student_count))
print("用类访问student_count 已创建的Student实例对象数为:{}".format(Student.student_count))

光谷实验中学学生:珊琳
已创建的Student实例对象数为:3

实例属性的定义和访问方法示例:

class Student():
    student_count = 0 # 这个student_count是类属性,前面不带self

    def __init__(self, input_name):
        self.name = input_name  # 这个name,前面带self,这用来定义一个实例属性,self就是指实例对象,实例对象最好在__init__中声明并初始化
        Student.student_count += 1 # 这里用“类名.类属性”调用类属性,实现每生成一个Student对象,student_count自增1

    def print_info(self): # 这个stu_info是方法print_info的局部变量,不是类属性
        stu_info = "光谷实验中学学生:" + self.name   # 在类定义内部访问 实例属性,用self.实例属性名
        print(stu_info)


s1 = Student("李浩")
s2 = Student('张淼')
s3 = Student('珊琳')
s3.print_info()
s3.score = 90  # 在类定义外部定义一个实例属性score
print(s3.name) # 在类定义外部,如果实例属性是公有的,可以通过"实例对象名.实例属性名"访问
print(s3.score) 
光谷实验中学学生:珊琳
珊琳
90

为什么类属性和实例属性同名会导致程序可读性和可维护性变差?请看下面的例子:

class Student(object):
    name = "Student calss name" # 给Student类定义了一个类属性 name

s1 = Student()
s2 = Student()
print(s1.name)
print(s2.name)
print(Student.name)
print("*" * 100)
s2.name = "s2 object name" # 给实例对象s2 定义了一个name的实例属性
print(s1.name)
print(s2.name)  # s2的实例属性覆盖了类属性,所以返回的是不是类属性的值
print(Student.name)

Student calss name
Student calss name
Student calss name
****************************************************************************************************
Student calss name
s2 object name
Student calss name





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值