类属性的定义方法:在类里面但不在类的方法里定义;不带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