测试


类:把一类事物的相同的特征和动作整合到一起。 类是一个抽象的概念
属性分为:1、数据属性;2、函数属性
类里有数据属性和函数属性
class的结构导致在类里定义的函数在对象调用的时候会自动设置一个self形参,也就是会谁调用就把谁当self当实参。
对象
对象:是基于类创建的一个具体的事物
实例化过程:在类里init方法为内置方法,当实例化对象的时候会触发类里的init方法。

对象只有一个数据属性,没有函数属性。需要的时候直接调用类里的函数属性。
属性查找顺序

查找顺序:如果是对象查找,先从对象的属性字典里查找,找不到再去类里的属性字典查找,再找不到就会报错。
查找属性:用点来查找属性。
查找类的属性:类名.属性名; 查找对象的属性:对象名.属性名
类有一个属性字典(用dict)可以查看,对象也有自己的属性字典同理方法可以查看,查找属性的时候,先从对象自己的属性字典里查,再到类里的属性字典查,类似于函数作用域的概念。属性查找顺序只作用于点的查找方法中,其他方法就不会安装属性查找顺序。
例子:

country = 'China'
class Chinese:
# country = 'China'
def init(self, name):
self.name = name
print('......', country)

def play_ball(self, ball):
    print('%s 正在打 %s' % (self.name, ball))

p1 = Chinese('alex')

输出:...... China

这种情况下,在init方法里查找country时,并不是用点方法查找,所以不安装属性查找顺序,直接找到类外面的counrty
counrty = '中国------'
class Chinese:
country = 'China'
def init(self, name):
self.name = name
print('......', counrty)

def play_ball(self, ball):
    print('%s 正在打 %s' % (self.name, ball))

p1 = Chinese('alex')

输出:...... 中国------
同理,counrty = 'china'是在类里定义的,当没有用点调用的时候,只会找到外层的country
内置方法

静态属性 property方法

将类中的函数属性变的像数据属性(简单来讲就是调用函数属性的时候不用加()去执行)
使用方法: 在函数属性前加装饰器 @property
在调用的时候和调用数据属性一样
类方法 classmethod方法

作用:在类中定于的函数属性都是为对象准备的,当我在想在类里调用这个函数的时候,在class方法下函数会默认一个self参数,导致了传参的时候不行传入一个对象,在这种情况下在函数上加上装饰器 @classmethod后该函数就会变成默认给类调用,定义函数的时候python会自动给函数加上一个cls参数,也就是默认把类传进去。
这样就实现了在类里调用函数属性而不用传入对象了。
意义: 在类里进行操作,和对象没有关系的时候。
静态方法 staticmethod方法

作用: 在类的函数属性上加上装饰器@staticmethod后,python不会给函数自动加上任何参数,这就变成了一个普通函数,可以自己设置参数。
小结:

静态属性:可以访问对象自己也可以访问类的。 类方法:可以访问类的数据属性和类的函数属性,但不能访问到对象的属性 静态方法:不能访问类属性和对象属性,只是类的工具包
组合
组合是一种‘有‘的关系,用组合的方式建立了类与组合的类之间的关系,比如学校有老师,人有手,人有脚的关系。
总结: 当来之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好。
抽象类

什么是抽象类:是接口与归一化设计
什么是接口:定义一个基类,基类当中把自己的方法用装饰器的形式定义成接口函数,来一个子类继承它,那子类中就必须实现基类的这个方法,否则就没办法实例化。这样设计下来比普通的继承的好处再于归一化。
归一化的好处:使得使用者无需关心对象是什么,只需要知道这些对象都具备些什么功能就行了。
基类也就是抽象类是不能实例化,他只定义规范,不用写具体的逻辑,在子类中再定于具体逻辑
面向对象三大特性
1、继承

什么时候用继承:
当类之间有很多相同的功能,提取这些相同的功能做成基类,用继承比较好。
2、多态

什么是多态: 多态是指在不考虑实例的类型的情况下使用实例不同的对象调用相同的方法)
3、封装

封装字面意思就是把东西装到袋子里,并且封起来,让外部无法看到。
python中用单下划线是
面向对象内置方法
一、反射

什么是反射:主要是指程序可以访问、检测和修改它本身状态或行为的一种能力,在面向对象中就是指通过字符串的形式操作对象相关的属性。
1.hasattr(object,name)

判断object这个对象中有没有字符串中name这个属性
class Day:
country = 'china'
def init(self,name):
self.name = name

d = Day('jack')
print(hasattr(d, 'country'))

输出:True

判断d这个对象中有没有counrty这个属性(字符串形式),会返回True或者False 这两种状态
2.getattr(object,name,default=None)

原文地址:https://www.cnblogs.com/aaaajayheng1990/p/9095762.html