![Python程序设计案例课堂](https://wfqqreader-1252317822.image.myqcloud.com/cover/463/26943463/b_26943463.jpg)
6.4 类实例
类实例(class instance)是一个Python对象,它是使用类所创建的对象。每一个Python对象都包含下列属性:识别码(identity)、对象类型(object type)、属性(attribute)、方法(method)及数值(value)。
6.4.1 创建类实例
要创建一个类实例时,只要指定变量给类名称即可。例如:
>>>x = myClass()
x即是一个类实例变量,注意类名称之后须加上小括号。
(1)使用id()内置函数,可以返回类的识别码(identity)。例如:
>>>id(x) 47667824
(2)使用type()内置函数,可以返回类的对象类型(object type)。例如:
>>> type(myClass) <type 'class'> >>> type(x) <class '__main__.myClass'>
对象的属性(attribute),也叫作数据成员(data member)。当用户要指向某个对象的属性时,可以使用object.attribute格式,其中object是对象名称,attribute是属性名称。所有该类的实例都会拥有该类的属性。
下例案例创建一个简单的类,并且设置类的3个属性name、sex与phone。
>>>class myClass: def __init__(self, name=None, sex=None, phone= None): self.name = name self.sex = sex self.phone = phone >>> #创建一个类的实例变量 >>> x = myClass("John", "male", "12345678") >>> x.name, x.sex, x.phone ('John', 'male', '12345678') >>> y = myClass("Machael", "male", "22222222") >>> y.name, y.sex, y.phone ('Machael', 'male', '22222222')
在这个类的构造方法中,所设置name、sex与phone的默认值是None。
在创建类的时候,可以不必声明属性。等到创建类的实例后,才动态创建类的属性。
例如:
>>> class DummyClass: pass >>> x = DummyClass() >>> x.name = "John"
用户可以使用isinstance(instance_object, class_object)内置函数,测试instance_object是否是class_object的实例,如果是的话则返回True,否则返回False。其中instance_object是一个类的实例对象,class_object是一个类对象。
>>> class a: pass >>> b = a() >>> isinstance(b, a) True
用户可以在类内定义类变量(class variable),这些类变量可以被所有该类的实例变量所分享。
下列案例创建一个类Student,并且定义一个类变量default_age:
>>>class Student: default_age = 18 #类变量 def __init__(self): self.age = Student.default_age #实例变量的变量 >>> Student.default_age 18 >>>x = Student() >>>x.age, x.default_age (18, 18)
在Student类的构造方法内,设置x类实例的age属性值,是类变量default_age的值。default_age是一个类变量,Student类有default_age属性,所以x类实例也会有default_age属性。而age是一个实例的变量,Student类不会有age属性,只有x类实例有age属性。
注意引用default_age类变量时,必须使用Student.default_age,而不能只使用default_age。因为类内函数的全局命名空间是定义此函数所在的模块,而不是该类。如果只使用default_age,Python会找不到default_age的定义所在:
>>>class Student: default_age = 18 def __init__(self): self.age = default_age >>>x=Student() Traceback (most recent call last): File "<pyshell#86>", line 1, in <module> x = Student() File "<pyshell#85>", line 4, in __init__ self.age = default_age NameError: name 'default_age' is not defined
如果将实例变量的名称设置成与类变量的名称相同,Python会使用实例变量的名称:
>>> class Student: default_age = 18 #类变量 def __init__(self, age): self.default_age = age #实例变量 >>> Student.default_age 18 >>> x = Student(15) >>> x.default_age, x.default_age (15, 15)
注意x实例有两个属性,其名称都是default_age。但是由于Python会先搜索实例变量的名称,然后才搜索类变量的名称。所以default_age的值是15,而不是18。
6.4.2 类实例的内置属性
所有Python的类实例都具有下列属性。
(1)obj.__dict__:类实例内的属性是以字典对象的方式存储。__dict__属性为此字典对象的值。例如:
>>> class myClass: def __init__(self, name=None, sex=None, phone= None): self.name = name self.sex = sex self.phone = phone >>>x = myClass() >>>x.__dict__ {'sex': None, 'name': None, 'phone': None}
(2)obj.__class__:__class__属性返回创建此类实例所用的类名称。例如:
>>> class myClass: def __init__(self, name=None, sex=None, phone= None): self.name = name self.sex = sex self.phone = phone >>> x = myClass() >>> x.__class__ <class '__main__.myClass'>