2018-12-17面向对象总结
Posted youmeishaoye
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018-12-17面向对象总结相关的知识,希望对你有一定的参考价值。
面向对象总结
面向对象(oop)
类:抽象概念,类型,是对一群具有相同特征或者行为的事物的一个统称,是抽象的,不能直接使用
对象:实际物体,类实例化对象,由类创建出来的一个具体存在
属性:
描述类 : 类属性
描述对象 : 实例属性
行为:被称为方法
类和对象的关系
对象是根据类创建出来的,先有类,再有对象
类只有一个,而对象可以有很多个
类中定义了什么属性一和方法,对象中就有什么属性和方法,不可能多,也不可能少
定义类:
class 类名:
def 方法1 (self , 参数列表):
pass
def 方法1 (self , 参数列表):
pass
创建对象:
对象变量= 类名()
初始化:对象变量.方法1()
对象变量.方法2()
私有属性和私有方法:
私有属性和方法就是对象不希望公开的属性和方法,只希望在对象的内部被使用
定义属性或方法时,在属性名或方法名前,增加两个下划线,定义的就是私有属性或方法 私有属性和方法,外部不能直接访问到
例如:
class Women:
def __init __(self,name):
self.name = name
self.__age = 18
def __secret(self):
print(self.__age)
s1=Women()
print(s1.secret())
私有属性:解释器做了名字的修改
print(s1.Women__age)
私有方法:
s1.Women__secret()
继承:
继承分为:单继承和多继承
单继承:子类拥有父类的所有方法和属性
子类继承自父类,可以直接享受父类中已经封装好的方法,不需要再次开发
子类中应该根据职责,封装子类特有的属性和方法
继承的语法:
class 类名 (父类名):
pass
例如:class A :
pass
class B(A)
pass
继承的传递性:
c类从b类继承,b类又从a类继承,那么c类就具有b类和a类的所有属性和方法
子类拥有父类以及父类的父类中封装的所有属性和方法
多继承:
子类可以拥有多个父类,并且具有所有父类的属性和方法
语法:
class 子类名(父类名1,父类名2)
pass
mro:查看方法搜索顺序,主要用于多继承时判断方法,属性的调用路径
在搜索方法时,是按照 __mro__
的输出结果 从左至右 的顺序查找的
如果在当前类中 找到方法,就直接执行,不再搜索
如果 没有找到,就查找下一个类 中是否有对应的方法,如果找到,就直接执行,不再搜索
如果找到最后一个类,还没有找到方法,程序报错
多态:
多态是不同的子类对象,调用相同的父类方法,产生不同的执行结果
多态可以增加代码的灵活度
class Animal(object): def run(self): print(‘animal is running‘) class Dog(Animal): def run(self): print(‘Dog run fast‘) class Rabbit(Animal): def run(self): print(‘Rabbit jump...‘) class Cat(Animal): pass class Timer(object): def run(self): print(‘the time is running‘) # 多态:同一种类型,不同的表现形式 def runTwice(animal): animal.run() animal.run() a = Animal() rabbit = Rabbit() runTwice(a) runTwice(rabbit) # 鸭子类型 tm = Timer() runTwice(tm)
限制实例属性:
__slots__=("name", "age")#只允许由”name“ ,”age“ 属性
修饰器:
@property 可以直接获取值 ,可以单独存在
设置器:
@score。setter,不单独存在,一定要有property
class Person(object): __slots__ = (‘name‘, ‘age‘) # 只允许由‘name‘ ‘age‘属性 ‘‘‘ per1 = Person() per1.name = ‘小明‘ print(per1.name) per1.height = 167 # 不允许 ‘‘‘ class Student(object): def __init__(self, age): self.__age = age ‘‘‘ def setScore(self, score): if 0 <= score <= 100: self.__score = score return ‘ok‘ else: return ‘error‘ def getScore(self): return self.__score ‘‘‘ @property # 访问器 可以单独存在 def score(self): print(‘getter is called‘) return self.__score @score.setter # 设置器 不单独存在,一定要有property def score(self, score): print(‘setter is called‘) if 0 <= score <= 100: self.__score = score return ‘ok‘ else: return ‘error‘ @ property def age(self): return self.__age s1 = Student(20) ‘‘‘ if s1.setScore(10) == ‘ok‘: # s1.score= 100 print(s1.getScore()) ‘‘‘ s1.score = 100 print(s1.score) print(s1.age
魔法方法:
__str__:打印本类的对象时,自动调用
__repr__:在解释器环境下直接输出本对象,自动调用方法
__iter__:返回可迭代的对象,
__next__:随着打循环自动调用
__len__:调用本类对象时候自动调用方法
___getitem__:索引时自动调用的方法
__call__:调用本类对象的时候自动调用方法
以上是关于2018-12-17面向对象总结的主要内容,如果未能解决你的问题,请参考以下文章