第十六课 类和对象
一.
对象:就是把数据与功能整合在一起,即一个盛放数据与功能的容器
类: 即类别种类,是面向对象分析和设计的基石,对象是类的实例,可以把同一类对象相同的数据与功能存放到类里,而无需每个对象都重复存
一份,每个对象里只需存自己独有的数据即可,极大地节省了空间。
在程序中,必须要事先定义类,然后再调用类产生对象(调用类拿到的返回值就是对象)
类的定义:
class Turle(): //定义一个类,首字母要大写,定义一个函数首字母小写
eg:
class Person:
name = 'tjc'
def printName(self):
print(self.name)
类的创建语法:
class 类名(继承列表)
实例方法定义
类变量定义
类方方法
静态方法
实例方法:
语法:
class 类名(继承列表)
def 实例方法名(self,形式参数1,形式参数2,)
语句
实例方法如果没有return语句,则返回none
实例方法的调用语法:
实力.实例方法名(调用参数)
类中定义的函数一般都至少有一个参数,且一般叫self
1.self代表的是传入一个类的对象,一般类的函数都是给对象用的,因此函数需要知道调用我这个函数的到底是那个对象,因为函数中可能会用到对象的一些特有属性
2.如果类中定义的函数没有参数,那么该函数只能被类调用,不能被对象调用。
3.绑定方法,据说有了这个参数,Python 再也不会傻傻分不清是哪个对象在调用方法了,你可以认为方法中的 self 其实就是实例对象的唯一标志
构造方法:
作用:
创建对象时初始化实例变量
语法:
def _init_(self[,形式参数列表]):
语句...
说明:
1.构造方法名必须为_init_ 不可改变
2.在一个类中只能有一个_init_构造方法
3.构造方法如果没有return 语句,则会返回self自身
析构方法:
class 类名:
_del_(self):
pass
析构方法会在对象被销毁是被自动删除
类变量
1.是指再类class内定义的变量,此变量属于类,不属于此类的对象
2.类变量可以通过该类直接使用也可以用过该类的实例直接访问
例:
class Human:
home = '地球' //这里就是再类里面定义的 不是再函数里面定义的
def _init_(self,name):
self.name = name
二.
我们不希望对象的属性或方法被外部直接引用,我们可以在属性或方法名字前边加上双下划线,这样子从外部是无法直接访问到,会显示AttributeError错误
eg:
>>> class Person:
__name = '小甲鱼'
def getName(self):
return self.__name
>>> p = Person()
>>> p.__name
Traceback (most recent call last):
File "<pyshell#56>", line 1, in <module>
p.__name
AttributeError: 'Person' object has no attribute '__name'
>>> p.getName()
'小甲鱼'
我们把getName方法称之为“访问器”。Python事实上是采用一种叫“name mangling”技术,将以双下划线开头的变量名巧妙的改了个名字而已,我们仍然可以在外部通过“_类名__变量名”的方式访问:n%_]r#*ck
>>> p._Person__name'小甲鱼'
三.
封装
作用:
是指隐藏细节,让使用者不关心这些细节。
注:
python的封装是假的(模拟的)封装
私有实例变量和方法
python类中,一双下划线‘__’开头,不以双下划线结尾的标识符为私有成员
私有成员分为:
私有属性和私有方法
私有成员在子类和类外部无法访问
示例:
class A:
def __init__(self,args):
self.__p = args //私有成员
def__private_method(self): //私有方法
print('')
def showA(self): //公开方法
print('self.__p=',self.__p)
self.__private_method()
继承
单继承的语法:
class 子类(父类)
......
法一:调用未绑定的父类的方法
class 子类(父类)
父类的名字.父类中的函数名(self)
......
法二:使用super函数
class 子类(父类)
super().函数名() // 不用self
........
子类可以继承/遗传父类所有的属性,因而继承可以用来解决类与类之间的代码重用性问题
多重继承:
class 子类(父类一,父类二,父类三)
..........
多态 polymorphic
什么是多态:
字面意识:“多种状态”
覆盖 override(也叫重写 overwrite)
什么是覆盖
覆盖是指有继承关系的类中,子类中实现了与基类同名的方法,在子类实例调用的是子类中的覆盖版本,这种现在叫做覆盖
子类对象显示调用基类方法的方式:
基类名.方法名(实例,参数)
四.组合
把类的实例化放到新类里
eg:
class Turtle:
def _init_(self,x)
self.num= x
class Fish:
def _init_(self,x)
self_num=x
class Pool:
def _intit_(self,x, y)
self.turtle = Turtle(x) // 把乌龟类实例化给变量self.turtle
self.fish = Fish(y) // 把鱼类实例化给变量self.fish
def print('水池里一共有%d 只乌龟,%d条鱼'%(self.turtle.num,self.fish.num))