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)

 

posted @ 2019-06-24 22:13  Tarzen  阅读(184)  评论(0编辑  收藏  举报