类的实例
一、类实例化:类的实例化就是将类赋值给不同的对象.
1、实例化对象:
>>> class newClass(): pass # 像调用函数一样的表达式直接进行类的实例化: >>> newObj = newClass()
2、使用__init__构造器初始化实例:
>>> class newClass(): pass >>> newObj = newClass() >>> class newClass(): def __init__(self,name): self.name = name # 如果类的__init__函数中有参数且不是默认参数,那么进行实例化时必须将参数传进去,否则将会报错: >>> newObj = newClass() Traceback (most recent call last): File "<pyshell#21>", line 1, in <module> newObj = newClass() TypeError: __init__() missing 1 required positional argument: 'name' >>> newObj = newClass('new class') >>> newObj.name 'new class' >>> # 这里可以看到__init__函数的参数使用和普通的函数中的参数是一样的: >>> class newClass(): def __init__(self,name='new class'): self.name = name >>> newObj = newClass() >>> newObj.name 'new class' >>>
3、__del__解构器,当实例被删除后会调用这个解构器,和类初始化时是逆过程。
>>> class InstTrack(): count = 0 def __init__(self): InstTrack.count += 1 def __del__(self): InstTrack.count -= 1 def howMany(self): return InstTrack.count >>> a = InstTrack() >>> b = InstTrack() >>> id(a) 1786701000432 >>> id(b) 1786701000544 >>> a.howMany() 2 >>> b.howMany() 2 >>> del a >>> b.howMany() 1 >>> del b >>> InstTrack.count 0
二、实例属性
1、通过__init__()构造器设置静态属性;
2、通过__init__()构造器提供默认属性:和函数定义的默认参数是一样的;
3、__init__()不应该有return语句,不该返回对象,或者说应该返回None(即使一个函数中没有显示的写return语句,但是依然会默认返回None),由于在实例化时会默认调用__init__构造器,因此如果有return语句,那么实例就是这个返回的对象,而不是类返回的实例了,如:
# 如果返回非None值在实例化时会报错: >>> class MyClass(): def __init__(self): print("Initialized...") return 1 >>> mc = MyClass() Initialized... Traceback (most recent call last): File "<pyshell#48>", line 1, in <module> mc = MyClass() TypeError: __init__() should return None, not 'int' # 返回Nnone时就不会报错了: >>> class MyClass(): def __init__(self): print("Initialized...") return None >>> mc = MyClass() Initialized... >>>
三、查看实例属性
1、dir()内建函数查看类属性:
>>> class Example(): pass >>> ex.user = 'root'
>>> ex = Example()
>>> ex.pri = 775 >>> dir(Example) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__'] >>> >>> dir(ex) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'pri', 'user'] >>>
2、__dict__():实例属性组成的字典
>>> class Example(): pass >>> ex = Example() >>> ex.user = 'root' >>> ex.pri = 775 >>> ex.__dict__ {'pri': 775, 'user': 'root'} >>>
3、__class__():可以检查实例对象是哪个类初始化而来的
>>> ex.__class__ <class '__main__.Example'> >>>
四、类属性和实例属性
1、类属性可通过实例获取和修改,实例属性只有实例可以获取和修改。
>>> class Example(): version = 1.2 #定义了一个类的静态成员属性 >>> ex = Example() # 在实例中没有创建属性时会通过类以及基类寻找属性,找到后可返回: >>> ex.version 1.2 # 类可以调用自己的静态属性 >>> Example.version 1.2 # 类修改类属性: >>> Example.version = 1.3 >>> Example.version 1.3 # 此时实例属性查看时也发生了变化: >>> ex.version 1.3 >>> # 但是此处给实例新增加了一个同名的属性,这个属性是这个实例的属性,与类的属性是分开的: >>> ex.version = 1.0 >>> ex.version 1.0 # 可以看到类属性是没有变化的: >>> Example.version 1.3 # 此时再实例化一个新实例,它的属性值也是默认的类属性: >>> ex2 = Example() >>> ex2.version 1.3 # 此时再次删除ex实例属性后,再次访问到的是类属性的值: >>> del ex.version >>> ex.version 1.3
五、调用和方法的绑定
1、调用绑定方法:即通过实例调用绑定在实例上的方法,在实际调用时不需要传入self的参数,self作为第一个参数被默认传入。
>>> class SaySomething(): def __init__(self,sayWord = 'hello,world!'): self.sayWord = sayWord def say(self): print(self.sayWord) >>> say1 = SaySomething() # 通过实例调用绑定的方法: >>> say1.say() hello,world! # 通过类调用绑定的方法时会报错: >>> SaySomething.say() Traceback (most recent call last): File "<pyshell#150>", line 1, in <module> SaySomething.say() TypeError: say() missing 1 required positional argument: 'self' >>>
2、调用非绑定方法:最常用的是在子类中覆盖父类的方法,如在子类的__init__()构造器中覆盖父类构造器,但是在调用时必须显示的传入self参数,解释器才能知道需要初始化的是一个类而不是绑定在类上的实例:
>>> class SayOneWord(SaySomething): def __init__(self): SaySomething.__init__(self) >>> say2 = SayOneWord() >>> say2.say() hello,world! >>>
软件即未来。