#面向对象简介
面向对象(Object oriented Programming,OOP)
Python 中,
一切皆对象。
class 类名:
类体
- 类体中我们可以定义属性和方法。属性用来描述数据,方法(即函数)用来描述这些数据相关的操作。
- 类方法第一个参数必为:
self 。 self 指的就是刚刚创建好的实例对象。
Python对象包括: 3. id(identity 识别码) 4. type(对象类型) 5. value(对象的值) (1) 属性(attribute) (2) 方法(method)
new()方法
作用:用于创建对象,但我们一般无需重定义该方法。
init()方法(构造函数)
作用:初始化创建好的对象的相关属性,无返回值。
- 通过“类名(参数列表)”来调用构造函数。调用后,将创建好的对象引用返回给相应的变量。
- 不定义
__init__ 方法,系统提供默认的__init__ 方法。定义带参的__init__ 方法,则系统不创建默认的__init__ 方法。
实例对象
实例属性
实例属性(实例变量)是从属于实例对象的属性。
- 实例属性一般在
__init__() 方法中定义: self.实例属性名 = 初始值 - 本类其他实例方法中,通过 self 访问:
self.实例属性名 - 创建实例对象后,通过实例对象访问:
obj01 = 类名()
obj01.实例属性名 = 值
实例方法
实例方法是从属于实例对象的方法。
def 方法名(self [, 形参列表]):
函数体
方法的调用格式如下:
对象.方法名([实参列表])
注:
- 定义实例方法时,第一个参数必须为
self 。 - 调用实例方法时,不需要也不能给
self 传参。self 由解释器自动传参。 dir(obj) 可以获得对象的所有属性、方法obj.__dict__ 对象的属性字典pass 空语句(什么都不做)isinstance(对象,类型) 判断“对象”是不是“指定类型”
类对象
当解释器执行 class 语句时, 就会创建一个类对象。
类属性
类属性是**从属于“类对象”**的属性,可以 被所有实例对象共享。
class 类名:
类变量名= 初始值
类中或类外,通过:“类名.类变量名 ”来读写。
类方法(@classmethod修饰)
类方法是从属于“类对象”的方法。 类方法通过装饰器@classmethod 来定义,格式如下:
@classmethod
def 类方法名(cls [,形参列表]) :
函数体
要点:
- @classmethod 必须位于方法上面一行。
- 第一个参数币为
cls ,指“类对象”本身; - 调用类方法格式:
类名.类方法名(参数列表) 。 且不需要也不能给 cls 传值。 - 类方法中访问实例属性和实例方法会导致错误
- 子类继承父类方法时,传入 cls 是子类对象,而非父类对象
静态方法(@staticmethod修饰)
“静态方法”和在模块中定义普通函数没有区别,只不过“静态方法”放到了“类的名字空间里面”,需要通过“类调用”。
静态方法通过装饰器@staticmethod 来定义,格式如下:
@staticmethod
def 静态方法名([形参列表]) :
函数体
要点:
@staticmethod 必须位于方法上面一行- 调用静态方法格式:
类名.静态方法名(参数列表) - 静态方法中访问实例属性和实例方法会导致错误
- 第一个参数无必须。
__del__方法(析构函数)
垃圾回收机制
__del__ 方法称为“析构方法”,用于实现对象被销毁时所需的操作。- Python 实现自动的垃圾回收,当对象没有被引用时(引用计数为 0),由垃圾回收器调用
__del__ 方法。 - 可通过
del 语句删除对象,从而保证调用__del__ 方法 - 系统会自动提供
__del__ 方法,一般不需要自定义析构方法
__call__方法
可调用对象
__call__方法的对象,称为“可调用对象”,即该对象可以像函数一样被调用
Python方法没有重载!
在类体中定义了多个重名的方法,只有最后一个方法有效!! 定义一个方法即可有多种调用方式, 相当于实现了其他语言中的方法的重载。
方法的动态性
Python 是动态语言,可以动态的为类添加新的方法,或者动态的修改类的已有的方法,动态添加时要有self
私有属性和私有方法
Python 对于类的成员没有严格的访问控制限制
- 通常我们约定,两个下划线开头的属性是私有的(private)。其他为公共的(public)。
- 类内部可以访问私有属性(方法)
- 类外部不能直接访问私有属性(方法)
- 类外部可以通过
_类名__私有属性(方法)名 (存储时私有属性(方法)改名)访问私有属性(方法)
_xxx保护成员&__xxx__系统定义成员
_xxx 保护成员,不能用“from module import * ”导入,只由类对象和子类对象能访问
@property 装饰器
@property 可以将一个方法的调用方式变成“属性调用”。
class Employee:
def __init__(self,name,salary):
self.name = name
self.__salary = salary
@property
def salary(self):
print("月薪为{0},年薪为 {1}".format(self.__salary,(12*self.__salary)))
return self.__salary;
@salary.setter
def salary(self,salary):
if(0<salary<1000000):
self.__salary = salary
else:
print("薪水录入错误!只能在 0-1000000 之间")
emp1 = Employee("高淇",100)
print(emp1.salary)
emp1.salary = -200
月薪为100,年薪为 1200
100
薪水录入错误!只能在 0-1000000 之间
注:
@property 修饰的属性,如果没有加 setter方法,则为只读属性 。
类编码风格
- 类名首字母大写,多个单词之间采用驼峰原则。
- 实例名、模块名采用小写,多个单词之间采用下划线隔开。
- 每个类,应紧跟“文档字符串”,说明这个类的作用。
- 可以用空行组织代码,但不能滥用。在类中,使用一个空行隔开方法;模块中,使用两个空行隔开多个类
|