类的构成元素

公共属性:实例化时无需__init__方法绑定到对象,就可以直接使用;

普通属性:实例化时 需要__ini__方法绑定到对象之后,才可以直接使用;

私有属性:__sex 双下滑杠开头,需要在类里定义函数属性(方法),对象调用函数属性间接访问;

特性:使用@property装饰器的方法,特性就是类的特殊属性,特殊之处在于普通属性是变量赋值的形式存在,它是一段代码(函数)返回值,因此可以借助@property把函数属性,模拟成变量属性,统一了调用接口;

特性分类:

1、只读特性@property装饰的函数

2、@diaplay.setter 可修改的特性

3、@diaplay.deleter 可以删除特性

--------------------------------------------------------------------------------------------------------------------------------------

绑定方法:实例调用时,该函数属性的 第一个形参自动传入对象本身;

静态方法:@staticmethod装饰的函数,称之为静态方法,无论对象还是类调用他,都不会把自身当做其第一个参数传入;说白了就是在类里定义了一个普通函数;也可以称为解绑函数,给类使用;

类方法:类方法是给类用的,类在使用时会将类本身当做参数传给类方法的第一个参数,python为我们内置了函数classmethod来把类中的函数定义成类方法;1

类的特殊方法:

0、__init__ (类里定义__init__构造方法,对象实例化时,触发__init__构造方法 初始化属性给对象)

1、__setattr__ (类里定义了__setattr__方法,对象设置属性时,触发该特殊方法执行;)

2、__delattr__(类里定义了__delattr__方法,对象删除属性时,触发该特殊方法执行;)

3、__getattr___ (类里定义了__getattr__方法,对象找不到属性时,触发该特殊方法执行;)

4、__str__(在类里定义__str__特殊方法,print 打印由这个类实例化出来的对象时,就会显示__str__特殊方法return的结果)

5、__setitem__(对象以字典的形式,设置属性时就会触发 ____setitem__特殊方法的运行)

6、__getitem__(对象以字典的形式,获取属性时就会触发__getitem__特殊方法的运行)

7、__delitem__(对象以字典的形式,删除属性时就会触发__delitem__特殊方法的运行)

8、__slots__ (在类里定义__slots__ 特殊方法之后,所有对象实例化时 自己不会再创建名称空间__dict__而且只能使用 __slots__ = ['x','x1','x2']里定义的属性)

9、__iter__和__next__(有__iter__方法的对象可迭代对象,可迭代对象执行__iter__方法变成迭代器;迭代器调用__next__就可以取一个迭代器里值,这样就不依赖索引取值了。)

10、__doc__(定义类的描述信息)

11、__del__(析构方法,当对象在内存中被释放时,自动触发执行。无需Python解释器回收垃圾;)

12、__enter__和__exit__(实现上下文管理协议 with open('a.txt','m') as f)

13、__call__(在类里定义了__call__实例化出来的对象,加上括号()就直接调用了__call__特殊方法里return的结果 )

14、__dict__(对象的属性和属性值)

classBaseReponse:def __init__(self):
self.status=False
self.data=None
self.error=None
self.msg=Nonedefget_dic(self):#返回1个对象的属性信息
return self.__dict__respnotallow=BaseReponse()
response.error=1
print(response.get_dic())
__dict__应用

15、__bases__(查看当前类继承的父类)

对象属性

# 对象私有属性(对象不可以直接访问)

# 绑定方法:但凡定义到类里面的方法都是 绑定方法;对象调用绑定方法,会自动把自己作为绑定方法的第一个参数,传进去;

#静态方法:解除绑定关系,本质上就是个函数,类和对象直接调用,不用传自己;所也以对象 不用实例化 也可以使用类里的方法了;

# 对象特性:property通过对象方法模拟出来的property(对象的特性 会 优先于对象属性被访问)

# 对象特性分为

#1.只读特性 2.可修改特性 3、可删除的特性

#classPeople():
# def __init__(self,Name,Sex):
# self.name=Name #self.name是对象实例时,调用__init__方法时,初始化给对象的属性;
# self.__sex=Sex #但凡属性有__(双下划线标识)就意味着着,这是初始化给对象的私有属性,对象不能直接访问;
# def diaplay(self): #如何访问私有属性呢?
#return self.__sex # 1、通过在类里 添加方法,对象通过这个借口访问;
#
# p=People('马腾飞','男')
# print(p.diaplay())
#
#classPeople():
# def __init__(self, Name, Sex):
# self.name=Name
# self.__sex=Sex
# @property #2、通过类类内部的方法访问__sex还需要加括号,于是在此基础上,有了 @property装饰器。
# def diaplay(self): #@property: 通过装饰类的方法,给对象模拟出一个只读属性;就是负责把一个方法变成属性调用的:
#returnself.__sex
# p1=People('黄蓉','男')
# p1.diaplay #这样通过 diaplay方法 模拟出来的diaplay属性 就可以,像访问普通属性一样的方法,访问私有属性了;
# print(p1.__dict__)
#
#
#classPeople():
# def __init__(self, Name, Sex):
# self.name=Name
# self.__sex=Sex
# #@property装饰器虽然解决了,私有属性 、方法的统一访问;模拟出了私有属性访问接口;
# @property # 但该 接口无法 修改,私有属性还是无法修改;
# def diaplay(self):
#returnself.__sex
# @diaplay.setter #于是在此基础上产生了@diaplay.setter 装饰器,可修修改 @property特性
# def diaplay(self,value):
# self.__sex=value #千万注意 @display_setter只是模拟出来的特殊属性,没有存储值得功能;所以要修改他的值一定要修改 他引用的真实值
#return#
# p2=People('黄蓉','男')
# print(p2.diaplay)
# p2.diaplay='male'# print(p2.diaplay)
#
#classPeople():
# def __init__(self, Name, Sex):
# self.name=Name
# self.__sex=Sex
# @property
# def diaplay(self):
#returnself.__sex
# @diaplay.setter
# def diaplay(self,value):
# self.__sex=value
#return# @diaplay.deleter #可删除 property 特性
# def diaplay(self):
# del self.__sex
#
# p3=People('黄蓉','男')
# print(p3.diaplay)
# del p3.diaplay
# print(p3.diaplay)
import time
#classDate:
# def __init__(self,Year,Month,Day):
# self.year=Year
# self.month=Month
# self.day=Day
# @staticmethod #@staticmethod,给类增加了一种新的实例化方式,直接调用类下面的方法,不用__init__
# def now(): #用Data.now的形式去产生对象,该实例用的就是当前的时间
# t=time.localtime()
# obj=(t.tm_year,t.tm_mon,t.tm_mday) #新建实例并且返回
#returnobj
#
# print(Date.now())
#
# d1=Date.now()
# print(id(d1))