面向对象,类的继承

面向对象
一种认识世界、分析世界的方法论。将万事万物抽象为类。
类class
类是抽象的概念,是万事万物的抽象,是一类事物的共同特征的集合。
用计算机语言来描述类,就是属性和方法的集合。
对象instance、object
对象是类的具象,是一个实体。
对于我们每个人这个个体,都是抽象概念人类的不同的实体。

面向对象3要素

  1. 封装
    组装:将数据和操作组装到一起。
    隐藏数据:对外只暴露一些接口,通过接口访问对象。比如驾驶员使用汽车,不需要了解汽车的构造细节,只需要知道使用什么部件怎么驾驶就行,踩了油门就能跑,可以不了解后面的机动原理。
  2. 继承
    多复用,继承来的就不用自己写了
    多继承少修改,OCP(Open-closed Principle),使用继承来改变,来体现个性
  3. 多态
    面向对象编程最灵活的地方,动态绑定

Python的类
定义
class ClassName:
语句块

  1. 必须使用class关键字
  2. 类名必须是用大驼峰命名
  3. 类定义完成后,就产生了一个类对象,绑定到了标识符ClassName上

类对象及类属性
类对象,类的定义就会生成一个类对象
类的属性,类定义中的变量和类中定义的方法都是类的属性
类变量,上例中x是类MyClass的变量
MyClass中,x、foo都是类的属性, doc 也是类的属性
foo方法是类的属性,如同 吃 是人类的方法,但是每一个具体的人才能吃东西,也就是说 吃 是人的实例才能调用
的方法。
foo是方法对象method,不是普通的函数对象function了,它一般要求至少有一个参数。第一个参数可以是
self(self只是个惯用标识符,可以换名字),这个参数位置就留给了self。
self 指代当前实例本身

实例化
a = MyClass() # 实例化
使用上面的语法,在类对象名称后面加上一个括号,就调用类的实例化方法,完成实例化。
实例化就真正创建一个该类的对象(实例)。
每次实例化后获得的实例,是不同的实例,即使是使用同样的参数实例化,也得到不一样的对象。
Python类实例化后,会自动调用 init 方法。这个方法第一个参数必须留给self,其它参数随意。
init方法
MyClass()实际上调用的是 init(self) 方法,可以不定义,如果没有定义会在实例化后隐式调用。
作用:对实例进行初始化
class MyClass:
def init(self):
print(‘init‘)

例对象instance
类实例化后一定会获得一个对象,就是实例对象。
上例中的tom、jerry就是Person类的实例。
init 方法的第一参数 self 就是指代某一个实例。
类实例化后,得到一个实例对象,实例对象会绑定方法,调用方法时采用jerry.showage()的方式。
但是函数签名是showage(self),少传一个参数self吗?
这个self就是jerry,Python会把方法的调用者作为作为第一参数self的实参传入。
self.name就是jerry对象的name,name是保存在了jerry对象上,而不是Person类上。所以,称为实例变量。
特殊属性 含义
name 对象名
class 对象的类型
dict 对象的属性的字典
qualname 类的限定名

类方法br/>1在类定义中,使用@classmethod装饰器修饰的方法
2必须至少有一个参数,且第一个参数留给了cls,cls指代调用者即类对象自身br/>3cls这个标识符可以是任意合法名称,但是为了易读,请不要修改
4通过cls可以直接操作类的属性
静态方法
1在类定义中,使用@staticmethod装饰器修饰的方法
2调用时,不会隐式的传入参数
静态方法,只是表明这个方法属于这个名词空间。函数归在一起,方便组织管理。

类几乎可以调用所有内部定义的方法,但是调用 普通的方法 时会报错,原因是第一参数必须是类的实例。
实例也几乎可以调用所有的方法, 普通的函数 的调用一般不可能出现,因为不允许这么定义。
总结:
类除了普通方法都可以调用,普通方法需要对象的实例作为第一参数。
实例可以调用所有类中定义的方法(包括类方法、静态方法),普通方法传入实例自身,静态方法和类方法需要找
到实例的类。

访问控制
私有(Private)属性
使用双下划线开头的属性名,就是私有属性
私有变量的本质:
类定义的时候,如果声明一个实例变量的时候,使用双下划线,Python解释器会将其改名,转换名称为_类名__变量名 的名称,所以用原来的名字访问不到了。

保护变量
在变量名前使用一个下划线,称为保护变量。
可以看出,这个_age属性根本就没有改变名称,和普通的属性一样,解释器不做任何特殊处理。
这只是开发者共同的约定,看见这种变量,就如同私有变量,不要直接使用。

私有方法的本质
单下划线的方法只是开发者之间的约定,解释器不做任何改变。
双下划线的方法,是私有方法,解释器会改名,改名策略和私有变量相同, _类名方法名 。方法变量都在类的 dict__ 中可以找到。
私有成员的总结
在Python中使用 _单下划线 或者 __ 双下划线来标识一个成员被保护或者被私有化隐藏起来。
但是,不管使用什么样的访问控制,都不能真正的阻止用户修改类的成员。Python中没有绝对的安全的保护成员
或者私有成员。
因此,前导的下划线只是一种警告或者提醒,请遵守这个约定。除非真有必要,不要修改或者使用保护成员或者私
有成员,更不要修改它们。

补丁
可以通过修改或者替换类的成员。使用者调用的方式没有改变,但是,类提供的功能可能已经改变了。
猴子补丁(Monkey Patch):
在运行时,对属性、方法、函数等进行动态替换。
其目的往往是为了通过替换、修改来增强、扩展原有代码的能力。

属性装饰器
一般好的设计是:把实例的属性保护起来,不让外部直接访问,外部使用getter读取属性和setter方法设置属性

特别注意:使用property装饰器的时候这三个方法同名
property装饰器
后面跟的函数名就是以后的属性名。它就是getter。这个必须有,有了它至少是只读属性
setter装饰器
与属性名同名,且接收2个参数,第一个是self,第二个是将要赋值的值。有了它,属性可写
deleter装饰器
可以控制是否删除属性。很少用
property装饰器必须在前,setter、deleter装饰器在后。
property装饰器能通过简单的方式,把对方法的操作变成对属性的访问,并起到了一定隐藏效果

对象的销毁
类中可以定义 del 方法,称为析构函数(方法)。
作用:销毁类的实例的时候调用,以释放占用的资源。其中就放些清理资源的代码,比如释放连接。
注意这个方法不能引起对象的真正销毁,只是对象销毁的时候会自动调用它。
使用del语句删除实例,引用计数减1。当引用计数为0时,会自动调用 del 方法。
由于Python实现了垃圾回收机制,不能确定对象何时执行垃圾回收。

封装
面向对象的三要素之一,封装Encapsulation
封装
将数据和操作组织到类中,即属性和方法
将数据隐藏起来,给使用者提供操作(方法)。使用者通过操作就可以获取或者修改数据。getter和setter。
通过访问控制,暴露适当的数据和操作给用户,该隐藏的隐藏起来,例如保护成员或私有成员。

类的继承
基本概念
面向对象三要素之一,继承Inheritance
人类和猫类都继承自动物类。
个体继承自父母,继承了父母的一部分特征,但也可以有自己的个性。
在面向对象的世界中,从父类继承,就可以直接拥有父类的属性和方法,这样可以减少代码、多复用。子类可以定
义自己的属性和方法。

继承
class Cat(Animal) 这种形式就是从父类继承,括号中写上继承的类的列表。
继承可以让子类从父类获取特征(属性和方法)
父类
Animal就是Cat的父类,也称为基类、超类。
子类
Cat就是Animal的子类,也称为派生类。

定义
格式如下
class 子类名(基类1[,基类2,...]):
语句块

特殊属性和方法 含义 示例
base 类的基类
bases 类的基类元组
mro 显示方法查找顺序,基类的元组
mro()方法 同上,返回列表 int.mro()
subclasses() 类的子类列表 int.subclasses()

从父类继承,自己没有的,就可以到父类中找。
私有的都是不可以访问的,但是本质上依然是改了名称放在这个属性所在类或实例的dict中。知道这个新名称
就可以直接找到这个隐藏的变量,这是个黑魔法技巧,慎用。
总结
继承时,公有的,子类和实例都可以随意访问;私有成员被隐藏,子类和实例不可直接访问,但私有变量所在的类
内的方法中可以访问这个私有变量。
Python通过自己一套实现,实现和其它语言一样的面向对象的继承机制。
属性查找顺序
实例的dict ===》 类dict ===如果有继承===》 父类 dict
如果搜索这些地方后没有找到就会抛异常,先找到就立即返回了。

方法的重写、覆盖override

面向对象,类的继承

原文地址:http://blog.51cto.com/13896223/2175811

时间: 2024-11-05 23:20:42

面向对象,类的继承的相关文章

Lua面向对象----类、继承、多继承、单例的实现

(本文转载)学习之用,侵权立删! 原文地址   http://blog.csdn.net/y_23k_bug/article/details/19965877?utm_source=tuicool&utm_medium=referral lua面向对象实现: 一个类就像是一个创建对象的模具.有些面向对象语言提供了类的概念,在这些语言中每个对象都是某个特定类的实例.lua则没有类的概念,每个对象只能自定义行为和形态.不过,要在lua中模拟类也并不困难. lua中,面向对象是用元表这个机制来实现.

面向对象 类的继承

/* 面向对象的三大特性:封装 .继承.多态 Dart中的类的继承: 1.子类使用extends关键词来继承父类 2.子类会继承父类里面可见的属性和方法 但是不会继承构造函数 3.子类能复写父类的方法 getter和setter */ class Person { String name='张三'; num age=20; void printInfo() { print("${this.name}---${this.age}"); } }class Web extends Perso

Lua的面向对象——类和继承

本文转载于:http://www.benmutou.com/archives/1791 终于来了,在Lua中的面向对象编程,相信目前学习Lua的大部分人都是为了开发手机网游吧.而且基本都是奔着脚本语言的热更新特性去的,所以全脚本开发变得十分流行. 对于普及不太广的Lua(相对于C++.Java等主流语言),需要短时间上手开发游戏,对新手而言不算简单.所以大家才更习惯于继续用面向对象思想去折腾Lua吧~ 好了,不唠叨了,我最不喜欢唠叨了.(小若:是是是,你一点都不唠叨,赶紧开讲!) 1.类的对象

(转载)【笨木头Lua专栏】基础补充20:面向对象——类和继承

终于来了,在Lua中的面向对象编程,相信目前学习Lua的大部分人都是为了开发手机网游吧.而且基本都是奔着脚本语言的热更新特性去的,所以全脚本开发变得十分流行. 对于普及不太广的Lua(相对于C++.Java等主流语言),需要短时间上手开发游戏,对新手而言不算简单.所以大家才更习惯于继续用面向对象思想去折腾Lua吧~ 好了,不唠叨了,我最不喜欢唠叨了.(小若:是是是,你一点都不唠叨,赶紧开讲!) 笨木头花心贡献,哈?花心?不,是用心~ 转载请注明,原文地址:http://www.benmutou.

Python 基础之面向对象类的继承与多态

一:继承 定义:一个类除了拥有自身的属性方法之外,还拥有另外一个类的属性和方法继承: 1.单继承 2.多继承子类: 一个类继承了另外一个类,那么这个类是子类(衍生类)父类:一个类继承了另外一个类,被继承的那个类是父类(超类,基类)object 是所有的类的父类1.单继承 #例:class Human():    def eat(self):        print("远古人类打猎,吃猎物") def sleep(self): print("远古人类吃饱了就睡觉")

python_way.day7 模块(configparser,xml,shutil,subprocess)、面向对象(上)(创建类,类的构成,函数式编程与面向对象编程的选择,类的继承)

python_way.day7 1.模块 configparser,xml,shutil,subprocess 2.面向对象(上) 创建类,类的构成,函数式编程与面向对象编程的选择,类的继承 1.模块 configparser 用于处理特定格式的文件,其本职上使用open来操作,只能是  [test1] 特定的格式 [test1] k1 = 123 k2 = True [test2] k1 = 123 k2 = v1 文件内容 1.获取 import configparser #打开文件找到文件

面向对象基础(继承类,抽象方法,接口,委托和事件)

1.页面上实现猫叫,狗叫,虎叫 <asp:Button ID="cat" runat="server" Text="猫叫" onclick="cat_Click" /><br/> <asp:Button ID="dog" runat="server" Text="狗叫" onclick="dog_Click" />

C++ Primer 学习笔记_72_面向对象编程 --句柄类与继承[续]

面向对象编程 --句柄类与继承[续] 三.句柄的使用 使用Sales_item对象能够更easy地编写书店应用程序.代码将不必管理Item_base对象的指针,但仍然能够获得通过Sales_item对象进行的调用的虚行为. 1.比較两个Sales_item对象 在编写函数计算销售总数之前,须要定义比較Sales_item对象的方法.要用Sales_item作为关联容器的keyword,必须能够比較它们.关联容器默认使用keyword类型的小于操作符,可是假设给Sales_item定义小于操作符,

Python基础(16)_面向对象程序设计(类、继承、派生、组合、接口)

一.面向过程程序设计与面向对象程序设计 面向过程的程序设计:核心是过程,过程就解决问题的步骤,基于该思想设计程序就像是在设计一条流水线,是一种机械式的思维方式 优点:复杂的问题的简单化,流程化 缺点:扩展性差 面向对象的程序设计:核心是对象,对象是特征(变量)与技能(函数)的结合体,是一种上帝式的思维方式 优点:解决了程序的扩展性 缺点:可控性差 二.类和对象 以游戏举例,基于面向对象设计一个款游戏:英雄联盟,每个玩家选一个英雄,每个英雄都有自己的特征和和技能,特征即数据属性,技能即方法属性,特

C++ Primer 学习笔记_71_面向对象编程 --句柄类与继承

面向对象编程 --句柄类与继承 引言: C++中面向对象编程的一个颇具讽刺意味的地方是:不能使用对象支持面向对象编程,相反,必须使用指针或引用. void get_prices(Item_base object, Item_base *pointer, Item_base &reference){ //需要根据指针或引用实际所绑定的类型进行调用 cout<< pointer ->net_price(1)<< endl; cout<< reference.n