博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
类的实例
阅读量:4701 次
发布时间:2019-06-09

本文共 4242 字,大约阅读时间需要 14 分钟。

一、类实例化:类的实例化就是将类赋值给不同的对象.

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 "
", line 1, in
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.count0

二、实例属性

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 "
", line 1, in
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__
>>>

 

四、类属性和实例属性

 1、类属性可通过实例获取和修改,实例属性只有实例可以获取和修改。

>>> class Example():    version = 1.2    #定义了一个类的静态成员属性>>> ex = Example()# 在实例中没有创建属性时会通过类以及基类寻找属性,找到后可返回:>>> ex.version1.2# 类可以调用自己的静态属性>>> Example.version1.2# 类修改类属性:>>> Example.version = 1.3>>> Example.version1.3# 此时实例属性查看时也发生了变化:>>> ex.version1.3>>> # 但是此处给实例新增加了一个同名的属性,这个属性是这个实例的属性,与类的属性是分开的:>>> ex.version = 1.0>>> ex.version1.0# 可以看到类属性是没有变化的:>>> Example.version1.3# 此时再实例化一个新实例,它的属性值也是默认的类属性:>>> ex2 = Example()>>> ex2.version1.3# 此时再次删除ex实例属性后,再次访问到的是类属性的值: >>> del ex.version>>> ex.version1.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 "
", line 1, in
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!>>>

 

转载于:https://www.cnblogs.com/OnOwnRoad/p/5335296.html

你可能感兴趣的文章
Dfs【p4906】小奔关闹钟
查看>>
【JMeter4.0】之遇到的问题总结(持续更新)
查看>>
计算机编码总结
查看>>
codevs 2964公共素数因数
查看>>
【CF653G】Move by Prime 组合数
查看>>
spring mvc+mybatis+sql server简单配置
查看>>
bzoj1664:参加节日庆祝
查看>>
[Usaco2005 dec]Layout
查看>>
ChatSecure
查看>>
中国剩余定理学习笔记
查看>>
深度学习中优化【Normalization】
查看>>
POJ2309BST(树状数组)
查看>>
洛谷P2114 起床困难综合症【位运算】【贪心】
查看>>
Ubuntu+caffe训练cifar-10数据集
查看>>
net 把指定 URI 的资源下载到本地
查看>>
js中 $ 未定义 或者 “xxx”未定义
查看>>
Sublime3插件安装
查看>>
[转]大型网站系统架构的演化
查看>>
一个游戏程序员的学习资料
查看>>
非常好的JSUI
查看>>