类的实例

Posted 疯狂的杰瑞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类的实例相关的知识,希望对你有一定的参考价值。

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

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!
>>> 

 

以上是关于类的实例的主要内容,如果未能解决你的问题,请参考以下文章

有条件地导入 python 类的片段

如何将 View 类中的代码片段移动到 OnAppearing() 方法?

创建片段而不从 java 代码实例化它

片段事务中的实例化错误

web前端开发JQuery常用实例代码片段(50个)

如何为 XSLT 代码片段配置 CruiseControl 的 C# 版本?