Python 第七天
OOP
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。数据封装、继承和多态是面向对象的三大特点。
类和实例
1.类,是抽象的模板,类似于 ES5 中的构造函数,只不过在 Python 中,类是通过 class 关键字来定义的,习惯上,类名首字母大写:
#class 关键字后面是 类名,紧接着是小括号,里面表示从哪个类继承
class Student(object):
pass
2.实例的创建很简单,就是类名加小括号,小括号里面可以添加类里面的参数
zx = Student()
3.类里面可以添加所有实例都拥有的属性。这是通过定义 init 方法来实现的
class Student(object):
def __init__(self,name,score):
self.name = name
self.score = score
xf = Student('qxf',99)
print(xf.name)
print(xf.score)
4.数据封装,通过上面方法添加的属性可以直接通过类里面的方法进行访问。
class Student():
def _init_(self,name,score):
self.name = name
self.score = score
def show(self):
print(self.name,'的成绩是',self.score)
qq = Student('jq',99)
qq.show()
访问限制
我们可以通过在属性名面前添加“__” 的方式来定义私有属性,私有属性不能通过实例对象直接访问
class NewObj():
def __init__(self,name,score):
self.__name = name
self.__score = score
newZx = NewObj('zx',99)
#会报错
print(newZx.__name)
关于继承
当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。子类可以直接调用父类的方法。
class Animal():
def __init__(self,name='Animal'):
self.name = name
def run(self):
print(self.name)
class Cat(Animal):
pass
cat = Cat('cat')
cat.run() #cat
关于多态
当子类和父类都存在相同的run()方法时,我们说,子类的run()覆盖了父类的run(),在代码运行的时候,总是会调用子类的run()。这样,我们就获得了继承的另一个好处:多态。对于上面的代码,如果为子类添加一个新的 run 方法,代码调用的时候总会调用子类的方法。
class Cat(Animal):
def run(self):
print(r'run 什么 run')
cat = Cat('cat')
cat.run() #run 什么 run
type(),isinstance(),dir(),getattr(),setattr(),hasattr()
1.type()函数可以判断对象类型,包括基本类型
type(123) #<class "int">
2.isinstance() 函数判断类型是否为输入第二参数的类型,并返回布尔值
isinstance('a',str) #true
3.dir() 函数返回一个包含字符串的 list ,list 中包含被测对象的所有属性
4.getattr() 和 setattr() 可以直接操作一个对象的状态
getattr(obj,'x') #获取 obj 的 'x' 属性,如果不存在会报错
getattr(obj,'x','default') #可以通过添加额外一个参数来解决报错,如果不存在,返回 'default'
setattr(obj,'y',90) #设置 obj 的 'y' 属性为 90
5.hasattr() 函数检测对象是否存在某方法,返回布尔值
slots
通过定义 slots 变量,我们可以限制 class 实例能够添加的属性
class Student(object):
__slots__ = ('name')
Xf = Student()
Xf.score = 99 #会报错
@property
在绑定属性的时候,为了安全,我们会定义一些私有属性。比如我们需要检查更改数值是否正确的时候。我们可以使用 @property 来实现
#@property
class Student(object):
def __init__(self,score = 60):
self._score = score
@property
def score(self):
return self._score
#使用@property会生成另外一个监视器@***.setter 。用以实现重新赋值操作
@score.setter
def score(self,val):
if not isinstance(val,int):
raise ValueError('score must be an integer')
if val < 0 or val > 100:
raise ValueError('score must between 0-100')
self._score = val
a = Student(90)
print(a.score)
#a.score = 9999 #报错
多重继承
一个子类可以继承多个父类,继承之间存在顺序
class Student(object):
pass
class Child(object):
pass
class Boy(Child,Student):
pass
# Boy 继承 Child 和 Student 的属性和方法,有同名时顺序为 Boy-Child-Student

浙公网安备 33010602011771号