Traceback (most recent call last):
File “learnoop.py”, line 20, in
print(Girl.__private_name)
AttributeError: type object ‘Girl’ has no attribute ‘__private_name’
方法
自带方法
常用自带方法
方法 | 作用 |
---|---|
__new__ | 在__init__函数之前执行,创建并返回一个新的对象。利用这个方法和类属性的特性可以实现设计模式中的单例模式。 |
__str__ | 在使用print语句时被调用。 |
__call__ | 将实例对象作为函数调用。 |
__getitem__,__setitem__,__delitem__ | 将类封装成一个字典的形式。 |
构造器
__init__()
方法的第一个参数为self关键字,类似于C++语言的this
当然,可以没有,那么这个方法建议你放到外面,作为函数,因为它和这个类没有太大关系。
def __init__(self):
self.name = 'WangXiuJie'
girl = Girl()
print(girl.name)
结果:
WangXiuJie
__new__()
实现单例模式
def __new__(cls, *args, **kwargs):
if not hasattr(Girl,'instance'):
cls.instance = object.__new__(cls)
return cls.instance
girl = Girl()
girl2 = Girl()
girl.name = 'ZhouDongYu'
print(girl2.name)
结果:
ZhouDongYu
即girl与girl2是同一个人。类似于小名/别名,但它们其实是一个。我们有一个对象就好了,不要三心二意。
解构器
__del__()
python有垃圾回收机制,不怎么用这个方法,不写了。
静态方法
使用修饰符@staticmethod
对于静态方法,不需要self,能够通过类对象访问
@staticmethod
def get_name():
return Girl.__name__
print(Girl.get_name())
Girl
类方法
使用修饰符@classmethod
对于类⽅法,第⼀个参数必须是类对象cls,能够通过实例对象和类对象去访问。
@classmethod
def set_name(cls, newName):
cls.name = newName
girl.set_name('Baby')
print(Girl.name)
Baby
私有方法
方法名前为__,不能从外部调用。
def __private_hobby(self):
print(f'我是{self.name},一名腐女,爱看男男~~')
girl.__private_hobby()
结果:
Traceback (most recent call last):
File “learnoop.py”, line 56, in
girl.__private_hobby()
AttributeError: ‘Girl’ object has no attribute ‘__private_hobby’
其他方法
def hobby(self):
print(f'我是{self.name},一名腐女,爱看男男(划掉)学习~~')
girl.hobby()
我是WangXiuJie,一名腐女,爱看男男(划掉)学习~~
对象/实例
在类后面加(),就可以得到类的一个实例——对象了,前面已经展示过了。
自带变量
这里指的是类变量,以及__init__()方法绑定到实例的属性。
print(dir(girl))
[‘_Girl__private_hobby’, ‘_Girl__private_name’, ‘__class__’, ‘__delattr__’, ‘__dict__’, ‘__dir__’, ‘__doc__’, ‘__eq__’, ‘__format__’, ‘__ge__’, ‘__getattribute__’, ‘__gt__’, ‘__hash__’, ‘_
_init__’, ‘__init_subclass__’, ‘__le__’, ‘__lt__’, ‘__module__’,