一:先搞懂定义
class Ball: #定义一个类
def __init__(self,name): #初始化对象
self.name = name
def kick(self): #方法
print('我是%s' % self.name)
>>> a = Ball('足球') #创建了一个对象
>>> a.kick()
我是足球
1、在开始定义时,称为类,class A...
2、定义写完了,定义的那个A
就称为类对象
3、类对象赋给某个变量,就称这个变量为实例对象下x= Mydemo()
,其中的x
就称为实例对象
4、类属性是指类定义里面所有的属性如i、long、width
,调用属性和调用方法的区别Class.name
调用属性,Class.name()
调用方法
5、对象 = 属性(静态的特征——>变量,高、长、重量)+方法(动态动作——>函数,跑、跳 def run(self)
def后面的就是方法)
6、 一个类可以实例化出无数的对象(实例对象) , Python 为了区分是哪个实例对象调用了方法,于是要求方法必须绑定(通过self参数)才能调用。而未实例化的类对象直接调用方法,因为缺少self参数,所以就会报错。
7、__init__(self)
中的self参数,python解释器会自动把当前的对象引用传递进去, __init__(self)
中,默认有1个参数名字为self,如果在创建对象时传递了2个实参,那么__init__(self)
中除了self作为第一个形参外还需要2个形 参,例如__init__(self,x,y)
二:具体例子分析
1、弄懂实例化
class Person() :
def name(self):
print('小朋友')
运行:
>>> a = Person() #Person是类对象,a是实例对象
>>> a.name() #a.name = Person().name,相当于实例化对象调用方法name
小朋友
>>> b = Person #这里Person没有括号,后面调用b.name()就提示错误
#Person没加括号是没有创造新的实例
#Person只表示符变为b,b.name()相当于Person.name()
#方法name有参数self,意味着需要创建实例才能调用。见6,所以报错
>>> b.name()
TypeError: name() missing 1 required positional argument: 'self'
>>> c = Person()
>>> c.name #c.name() 和c.name 有什么区别?
#c=Person()虽然创建了实例
#但是c.name并不是调用实例方法,只是调用其属性,见4
#而c.name的属性本身就是一个类方法对象,所以才会返回对象
运行:
>>> <bound method Person.name of <__main__.Person object at 0x000001C8A1DC3D48>>
class Person:
class Person(): #类名后面带括号与不带括号有区别吗?
#带不带括号无区别
#括号是为了继承类用的,默认继承object类,不加会自动添加
三:python中的属性,普通方法的衍生。
【1】操作类属性有三种方法:
1.使用@property装饰器操作类属性。
2.使用类或实例直接操作类属性(例如:obj.name,obj.age=18,del obj.age)
3.使用python内置函数操作属性。
1)getattr(obj, name[, default]):访问对象的属性,如果存在返回对象属性的值,否则抛出AttributeError异常。
2)hasattr(obj,name):检查是否存在某个属性,存在返回True,否则返回False。
3)setattr(obj,name,value):设置一个属性。如果属性不存在,会创建一个新属性,该函数无返回值。若存在则更新这个值。
4)delattr(obj, name):删除属性,如果属性不存在则抛出AttributeError异常,该函数也无返回值。
【2】Python内置类属性:
__dict__ : 类的属性(获取类所有信息):结果返回一个字典包含类属性及属性值,类方法等所有类信息
__doc__ :类的文档字符串,也就是类的帮助信息。
__name__: 类名
__module__: 类定义所在的模块 如果在当前模块返回’__main__’; 如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)
__bases__ : 类的所有父类(包含了所有父类组成的元组)
四:类与对象内置函数
1 .isinstance
2. issubclass
3、操作对象属性时自动触发
__setattr__添加/修改属性会触发它的执行
__delattr__删除属性的时候会触发
__getattr__只有在使用点调用属性且属性不存在的时候才会触发
__getattribute__
4、 使用key的形式操作属性时触发
__setitem__使用key的形式添加/修改属性时触发
__getitem__ 使用key的形式获取属性时触发
__delitem__使用key的形式删除属性时触发
5.描述符,描述符可以检测到一个属性的访问和修改,从而对这些操作增加额外的功能逻辑;
__get__():调用一个属性时,触发
__set__():为一个属性赋值时,触发
__delete__():采用del删除属性时,触发
6.静态属性property,本质就是实现了get,set,delete三种方法
7.对象的显示相关函数
__str__调用str函数或者print函数时自动执行,返回值作为显示内容
__repr__调用repr或者交互式解释器输出对象是自动执行,返回值作为显示内容
#注意:
#如果`__str__`没有被定义,那么就会使用`__repr__`来代替输出
#这俩方法的返回值必须是字符串,否则抛出异常
8.__format__调用format函数时自动执行,用于定制对象的格式化输出,
9.内存优化,__slots__
10.迭代器协议, __next__和__iter__
11.__doc__,帮助文档,隐藏属性,用于获取类的帮助文档,其实就是类下面的多行注释
12.__module__和__class__
__module__表示当前操作的对象在那个模块
__class__ 表示当前操作的对象的类是什么
13. __del__析构方法,当对象在内存中被释放时,会自动触发执行。
析构看做构建的反义词,构建指一个东西从无到有,析构指一个东西从有到无
14.上下文管理之__enter__和__exit__