1、面向对象(oop
)
面向过程:面向处理,更多的是注重计算每一个步骤
面向对象:认为万事万物皆对象,程序是由多个对象协作共同完成的,能更好的直接代码复用和设计复用
问题->面向对象分析(OOA)->发现对象->类->用类实例化对象->对象协作完成功能
2、类和对象
-
类:具有相同特征和行为的对象的集合
-
对象:具有某些功能和特征的具体事物的抽象,是类的实例
-
类定义必须使用关键字class,类名一般用大驼峰命名规则:每个单词首字母大写,其他小写
-
class MyDog(object):
#python3
默认继承自object,可以class Mydog
: 函数体
-
3、类
class MyDOg(object):
num = 100
#类属性 可以通过类名访问,也可以被对象访问.如果成员属性名和类属性名冲突,优先访问成员属性,成员属性屏蔽类属性.
def __init__(self,name,age,sex) #构造函数,一般用于完成对象数据成员设置初值或进行其他必要的 self.name = name #初始化工作,不会创建对象,如未提供,python会提供一个默认的构造函数
#成员属性,描述对象的静态特征,其实就是一个变量,作用域属于类。python中成员属性可以在构造函数中添加。成员属性属于对象,每个对象的成员属性的值都不同。
self.__age =age # 私有变量 外界不能直接对象.__age调用了,只能通过调用对象的公用方法来访问。
self.__sex =sex #私有变量
def bark(self):
print('汪汪') #成员公有方法,作用域在类内,成员方法的第一个参数必须是self,代表调用当前对象,只有对象可以调用
def eat(self):
print('吃骨头') #成员公有方法
#定义一个公开方法,间接访问私有变量 外界通过对象.get_age()
def get_age(self):
return self.__age
#定义一个公开方法,间接设置私有变量 外界通过对象.set_age()
def set_age(self,age):
self.__age =age
#对于私有属性的访问,使用公开方法间接访问的方法太麻烦,python提供了一种便捷语法,属性装饰器,通过属性装饰器,可以很方便的对私有属性访问,属性装饰器可以把方法属性化
@property #外界使用 对象.sex
def sex(self):
return self.__sex
@sex.setter #外界使用 对象.sex =sex
def sex(self,sex)
self.sex = sex
#定义一个成员私有方法(双下划线)
def __sleep(self):
print('这是我的地盘')
#外界通过,对象.__sleep()会报错,该方法为私有方法,只能在当前类中被成员公有方法调用。外界通过公有方法获取
#定义一个类方法
@classmethod
def c1(cls):
rerurn('我是类方法')
#定义一个静态方法
@staticmethod
def show():
return time.time()
def __del__(self): #析构函数,用来释放对象占用的资源,如果未提供,python将会提供一个默认的析构函数进行必要的清理工作。
def __str__(self):
return self.name
def __repr__(self):
return self.__str__()
#将对象转化为字符串,凡是涉及对象向字符串转化的都会调用(`print,str`),返回值是字符串.
#__repr__作用同__str__,不过是给解释器看的
dog = MyDog('泰迪') #对象的创建,对象的实例化 ,定义了一个 类 类型的变量
print(dog.__dict__) #__dict__属性可以查看实例属性
print(dog.__class__) #查看对象的类名
#属性获取
print(dog.name) #成员属性的调用:对象。成员属性
print(dog.get_age()) #获取私有属性age的值go
dog.set_age(10) #设置私有属性的值
print(dog.sex) #用了@property方法后获取属性值
dog.sex = sex #用了@sex.setter方法后修改属性值
dog.bark() #成员方法的调用
dog.eat().bark() #成员方法的连贯调用
- 属性私有化:如果想让类的内部属性不被外界直接访问,可以在这个属性的前面加两个下划线 ,在Python中,如果一个属性的前面出现两个下划线,就表示这个属性只能在当前类中的方法中访问,不能通过对象直接访问,这个变量就被称为私有变量
单下划线:_age #受保护的,可以访问的,约定俗称,不要使用它
双下划线:__age #私有的
两边都有双下划线: __age__ #系统内置变量
-
属性装饰器:对于私有属性的访问,使用公开方法间接访问的方法太麻烦,python提供了一种便捷语法,属性装饰器,通过属性装饰器,可以很方便的对私有属性进访问,属性装饰器可以把方法属性化。
描述器:描述器在监视特定属性的时候很有用,其只在新式类中起作用,种类至少实现了3个特殊的方法__get__, __set__, __delete__中的一个。 如果一个对象同时定义了 get() 和 set(),它叫做资料描述器(data descriptor)。仅定义了 get() 的描述器叫非资料描述器 描述器在属性访问时被自动调用。 调用优先级: 资料描述器 -> 实例字典 -> 非资料描述器
-
成员私有方法(属于对象)
- 如果以对一个方法的名字前面加双下划线__,声明该方法为私有方法,只能在当前类中被成员公有方法调用,在外界不能通过对象调用,这就是私有方法。
-
类方法
- 使用了装饰器
@classmethod
,第一个参数是当前类对象,该参数一般约定为cls
,通过它来传递类的属性和方法(不能传实例的属性和方法) - 调用:实例和类都可以调用
- 使用了装饰器
-
静态方法
- 使用装饰器
@staticmethod
- 使用装饰器