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)