zoukankan      html  css  js  c++  java
  • Python笔记_第三篇_面向对象_2.构造函数和析构函数(含self说明)

    1. 构造函数

      为什么要有构造函数

      打一个比方:类的创建就是好比你创建了好了一种格式的房间,你租给上一个住户的后,里面会对方很多“垃圾”和不规则的物品摆放。构造函数就是下一个住户再使用的时候进行物品的初始化摆放,防止下一个用户再使用的时候会出现没有初始化物品错放的错误等。

      构造函数的格式:

      __init__( ):

      注意:在使用创建对象的时候会自动调用,构造函数用于初始化类实例的状态。如果不显式的创建构造函数,默认会自动添加一个构造函数。其实由于没有本身都会带上这个构造函。但是还是要写上比较好。

      举例说明:

    class Person(object):
        def __init__(self,name,age,height,weight):
            print(name,age,height,weight)
            self.name = name
            self.age = age
            self.height = height
            self.weight = weight
        def run(self):
            print("run")
        def eat(self,food):
            print("eat " + food)
    
    per3 = Person("hanmeimei",20,170,55)
    print(per3.name,per3.age,per3.height,per3.weight)
    # hanmeimei 20 170 55
    # hanmeimei 20 170 55
    
    per4 = Person("lilei",18,180,80)
    print(per4.name,per4.age,per4.height,per4.weight)
    # lilei 18 180 80
    # lilei 18 180 80

    2. 析构函数

      为什么要有析构函数

        之前我们在第一篇关于内存详细解析的时候说过,在高级的语言类似于C/C++、java等不需要手动的去释放内存。在这类语言当中有自动的内存管理机制。其实析构函数就是释放类在调用后的一种内存释放作用。因此我们释放内存常用的一共有四种,释放类的内存,释放实例化的内存,释放函数内存,释放变量内存。析构函数就是释放类的内存的一种方式,但是我们有自动化的内存释放机制,这种方式一般我们也不太写。

      格式:

      __del__( )

      举例说明:

    # 第一种释放
    class Person(object):
        def __init__(self,name,age,height,weight):
            self.name = name
            self.age = age
            self.height = height
            self.weight = weight
        def __del__(self):
            print("这里是析构函数")
        def run(self):
            print("run")
        def eat(self,food):
            print("eat " + food)
        def say(self):
            print("Hello! My name is %s, I am %d years old" %(self.name,self.age))
    
    per5 = Person("hanmeimei",20,170,55)
    # 第二种释放
    del per5 # 对象释放后就不能在访问了
    
    # 第三种释放:在函数里定义的对象,会在函数结束时自动释放,这样可以用来减少内存空间的浪费。
    def func():
        perx = Person("aa",1,1,1)
    
    func()

    3. self说明

      我们发现,在类的列表中有一个object的父类。在属性和方法的编写的时候出现了self的这个东西。这个东西就是一种“自身限制”的作用。解释如下:  

      self:表示类的实例,而非类。那个对象调用方法,那么该方法中的self代表那个对象。

      self.__class__:代表类名。

      self.表示调用自身类。表示当前实例的引用。意思是:他只能被用在下列类成员的代码块中

      self的目的:

        用于区分类的成员和本地的变量或参数。

        作为调用方法的实参。

      self类似于C# 语言中的this.的意思

      举例说明:

    class Person(object):
        def __init__(self,name,age,height,weight):  
           # print(name,age,height,weight)
            self.name = name
            self.age = age
            self.height = height
            self.weight = weight
    
        def run(self):
            print("run")
        def eat(self,food):
            print("eat " + food)
        def say(self):
            print("Hello! My name is %s, I am %d years old" %(self.name,self.age))
            # self不是关键字,换成其他的标识符也是可以的,但是帅的人一般都用self
    
    per = Person("Tom",20,160,80)
    per.say()

    4.cls说明

      Self表示一个具体的实例本身。如果用了staticmethod(静态方法),那么饥渴五十这个self,把这个方法当成一个普通使用。

      cls表示这个类本身,常用用在返回这个类的方法或者属性的类型和信息信息。

    >>> class A(object):
            def foo1(self):
                print "Hello",self
            @staticmethod
            def foo2():
                print "hello"
            @classmethod
            def foo3(cls):
                print "hello",cls
    
    
    >>> a = A()
    
    >>> a.foo1()          #最常见的调用方式,但与下面的方式相同
    Hello <__main__.A object at 0x9f6abec>
    
    >>> A.foo1(a)         #这里传入实例a,相当于普通方法的self
    Hello <__main__.A object at 0x9f6abec>
    
    >>> A.foo2()          #这里,由于静态方法没有参数,故可以不传东西
    hello
    
    >>> A.foo3()          #这里,由于是类方法,因此,它的第一个参数为类本身。
    hello <class '__main__.A'>
    
    >>> A                 #可以看到,直接输入A,与上面那种调用返回同样的信息。
    <class '__main__.A'>
    --------------------- 
    作者:daijiguo 
    来源:CSDN 
    原文:https://blog.csdn.net/daijiguo/article/details/78499422 
    版权声明:本文为博主原创文章,转载请附上博文链接!
  • 相关阅读:
    [SoapUI] Compare JSON Response(比较jsonobject)
    [SoapUI] Command-Line Arguments
    [SoapUI] How to create a random UUID in each Request's Headers
    SoapUI Script Library
    [正则表达式] 正则表达式匹配UUID
    [远程] windows 2008 server设置了共享文件夹,并且共享给了everyone,但是还是无法访问,怎么解决呢?
    each
    WSDL Style和use的组合方式说明
    XML xsd
    java.lang.ClassNotFoundException: springosgi
  • 原文地址:https://www.cnblogs.com/noah0532/p/10858320.html
Copyright © 2011-2022 走看看