• Python中类


    1.类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self,self代表类的实例,而非类。

    self 不是 python 关键字,我们把他换成 runoob 也是可以正常执行的:

    2.

    python对象销毁(垃圾回收)

    Python 使用了引用计数这一简单技术来跟踪和回收垃圾。

    在 Python 内部记录着所有使用中的对象各有多少引用。

    一个内部跟踪变量,称为一个引用计数器。

    当对象被创建时, 就创建了一个引用计数, 当这个对象不再需要时, 也就是说, 这个对象的引用计数变为0 时, 它被垃圾回收。但是回收不是"立即"的, 由解释器在适当的时机,将垃圾对象占用的内存空间回收。Python 的垃圾收集器实际上是一个引用计数器和一个循环垃圾收集器

    3.

    单下划线、双下划线、头尾双下划线说明:

    • __foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的。

    • _foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *

    • __foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。

    4. new  和 init

    在创建对象的时候,init方法不是最早被调用的。而是new方法

    __new__方法接受的参数虽然也是和__init__一样,但__init__是在类实例创建之后调用,而 __new__方法正是创建这个类实例的方法,并且返回实例对象给init。

     p = Person(name, age)首先执行使用name和age参数来执行Person类的__new__方法,这个__new__方法会 返回Person类的一个实例(通常情况下是使用 super(Persion, cls).__new__(cls, ... ...) 这样的方式),

    当我们理解了__new__方法后,我们还可以利用它来做一些其他有趣的事情,比如实现 设计模式中的 单例模式(singleton) 。

    因为类每一次实例化后产生的过程都是通过__new__来控制的,所以通过重载__new__方法,我们 可以很简单的实现单例模式。

    5.

     ※  __new__和__init__的区别,说法正确的是? (ABCD

    A. __new__是一个静态方法,而__init__是一个实例方法
    B. __new__方法会返回一个创建的实例,而__init__什么都不返回
    C. 只有在__new__返回一个cls的实例时,后面的__init__才能被调用
    D. 当创建一个新实例时调用__new__,初始化一个实例时用__init__


    import time
    
    
    class Test():
        '''静态方法和类方法
        构造函数和析构函数'''
        print('第一个被打印')
    
        count = 0   #类属性:类和对象都可以调用   但是对象无法修改类属性
    
        def __new__(cls, name, age):  #new方法是类方法,
            print('__new__才是对象创建的时候调用的返回一个对象给init,中的self。而init是在创建完之后调用的')
            return super(Test,cls).__new__(cls)
    
        def __init__(self,name,age):    #self是当前类的对象本身,python解释器会自动把对象传入。代表类的实例,而非类
            print('“__init__”这个构造函数,具有初始化的作用,也就是当该类被实例化的时候就会执行该函数')
            self.name = name
            self.age = age
            Test.count += 1
    
        @classmethod     #类方法:类和对象都可以调用   。只能访问类属性
        def class_fun(cls):
            print('class fun%s'%(Test.count))
    
        def eat(self):
            print('这是实例方法')
    
    
          #静态方法,只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性。但是可以被对象和类调用
        '''静态方法和普通的方法就是作用域不一样,只能被当前对象和类调用,其他都一样'''
    
        @staticmethod
        def static_fun():
            print('静态方法')
    
    
        def __del__(self):
            print('当使用del 删除对象时,会调用他本身的析构函数,另外当对象在某个作用域中调用完毕,在跳出其作用域的同时析构函数也会被调用一次,这样可以用来释放内存空间。')
    
    
    
    oo = Test('fan',19)
    
    ff = Test('zz',20)   #创建了两个对象,那么count会增加到2
    
    ff.count = 4
    print(Test.count)
    ff.static_fun()
    Test.static_fun()
    oo.class_fun()
    print(oo.name)
    Test.class_fun()
    
    time.sleep(5)  #五秒之后调用del来释放空间
    class Test1():
        print('test1')
    
        @property               #把方法变成属性一样调用
        def get_name(self):        #这个必须要返回一个数据。
            return self.name
    
        @get_name.setter
        def get_name(self,name):
            self.name = name
    
    
    t1 = Test1()
    t1.get_name = 'fa'
    print(t1.get_name)
  • 相关阅读:
    [置顶] Codeforces Round #198 (Div. 1)(A,B,C,D)
    Python基础 1----Python语言基础和Python环境准备与安装
    UVa 10400
    Linux多线程——使用互斥量同步线程
    SICP 习题 (1.8) 解题总结
    浙江大学PAT上机题解析之1014. 福尔摩斯的约会 (20)
    3.11 程序改错
    汉语-汉字:芔
    汉语-汉字:屮
    汉语-汉字:艸
  • 原文地址:https://www.cnblogs.com/tarzen213/p/11079853.html
Copyright © 2020-2023  润新知