对象 = 属性 + 方法
 
面向对象特征:
分装 继承 多态【不同对象对同一方法响应不同行动】
 
类定义
class xxx:
  ....
  ....
 
类对象

类对象支持两种操作:属性引用和实例化

属性引用 使用和 Python 中所有的属性引用一样的标准语法:类对象名.属性名

类对象创建后,类命名空间中所有的命名都是有效属性名。所以如果类定义是这样:

class MyClass: 
  i = 12345
  def f(self):   
    return 'hello world'
 # 实例化类
x = MyClass()
# 访问类的属性和方法
print("MyClass 类的属性 i 为:", x.i)
print("MyClass 类的方法 f 输出为:", x.f())

以上创建了一个新的类实例并将该对象赋给局部变量 x,x 为空的对象

执行以上程序输出结果为:

  MyClass 类的属性 i 为: 12345

  MyClass 类的方法 f 输出为: hello world

类有一个名为 __init__() 的特殊方法(构造方法),该方法在类实例化时会自动调用,像下面这样:

def __init__(self):
  self.data = []

类定义了 __init__() 方法,类的实例化操作会自动调用 __init__() 方法。如下实例化类 MyClass,对应的 __init__() 方法就会被调用:

x = MyClass()

当然, __init__() 方法可以有参数,参数通过 __init__() 传递到类的实例化操作上。例如:

class Complex:
   def __init__(self, realpart, imagpart):
     self.r = realpart
    self.i = imagpart
x = Complex(3.0, -4.5)
print(x.r, x.i)                    # 输出结果:3.0 -4.5

self代表类的实例,而非类

类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。

class Test:
  def prt(self):
    print(self)
    print(self.__class__)
t = Test()
t.prt()

以上实例执行结果为:

<__main__.Test instance at 0x100771878>
__main__.Test

从执行结果可以很明显的看出,self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类

self 不是 python 关键字,我们把他换成xxx 也是可以正常执行的:

class Test:
  def prt(xxx):
    print(xxx)
     print(xxx.__class__)
t = Test()
t.prt()

以上实例执行结果为:

<__main__.Test instance at 0x100771878>
__main__.Test
类的方法

在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self, 且为第一个参数,self 代表的是类的实例

class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))

# 实例化类
p = people('jike',10,30)     【类的实例化操作会自动调用 __init__() 方法
p.speak()

执行以上程序输出结果为:

jike 说: 我 10 岁。
 
继承
class xxx(父类名):
  ....
  ....
 
 

需要注意圆括号中父类的顺序若是基类中有相同的方法名,而在子类使用时未指定,python从左至右搜索

即方法在子类中未找到时,从左到右查找基类中是否包含方法。

父类必须与派生类定义在一个作用域内。类定义在另一个模块中时还可以用表达式

class 派生类名(模块名.父类名):

举例

执行以上程序输出结果为:

ken 说: 我 10 岁了,我在读 3 年级

多继承

class 派生类名(Base1, Base2, Base3):
  ....
  ...  
 

需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索

即方法在子类中未找到时,从左到右查找父类中是否包含方法。

输出:

我叫 Tim,我是一个演说家,我演讲的主题是 Python

方法重写

 

 
 
 
类属性与方法

类的私有属性【不能在外部调用】

__private_attrs两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs

类的方法

在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。

self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定是用 self。

类的私有方法【不能在外部调用】

__private_method两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods

 

类的专有方法:

  • __init__ : 构造函数,在生成对象时调用
  • __del__ : 析构函数,释放对象时使用
  • __repr__ : 打印,转换
  • __setitem__ : 按照索引赋值
  • __getitem__: 按照索引获取值
  • __len__: 获得长度
  • __cmp__: 比较运算
  • __call__: 函数调用
  • __add__: 加运算
  • __sub__: 减运算
  • __mul__: 乘运算
  • __truediv__: 除运算
  • __mod__: 求余运算
  • __pow__: 乘方
 
 
 另外
 
# 针对__str__方法的例子:

# 各种运算符重载

反向运算符重载:

  • __radd__: 加运算
  • __rsub__: 减运算
  • __rmul__: 乘运算
  • __rdiv__: 除运算
  • __rmod__: 求余运算
  • __rpow__: 乘方

复合重载运算符:

  • __iadd__: 加运算
  • __isub__: 减运算
  • __imul__: 乘运算
  • __idiv__: 除运算
  • __imod__: 求余运算
  • __ipow__: 乘方

举例:

# 关于 __name__

 

# 类的静态方法、普通方法、类方法

 

pass ---占位符,表示稍后输入
 
如果子类定义与父类同名的方法或属性,会自动覆盖父类的方法或属性
 
 
子类覆盖父类方法时,若需要父类中该方法中的属性,则要先调用父类该方法,获得所需要的属性,再重写
 
 
1.调用未绑定的父类方法
该重写方法第一行: 父类名.xxxx(self ---将子类对象传入)
2.使用super函数
super().父类方法名() ---不需要给定任何父类的名字,自动一层层找出
 
 
 
 
默认要求,类定义中,方法的第一个参数是self == this,表示不同对象调用该方法时,传入一个该对象参数,用以区别谁调用此方法
构造方法:_init_(self) ---构造方法,实例化对象的时候会自动调用它,默认参数形式如上,此时不需要实例化的时候给与参数,,,,_init_(self,name) ---此时需要给个参数 xx=Yy(zz)
可以重写此方法自定义初始化操作
 
 

Python 面向对象【1】的更多相关文章

  1. python 面向对象初级篇

    Python 面向对象(初级篇) 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发" ...

  2. Python 面向对象 基础

    编程范式概述:面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现 ...

  3. python面向对象进阶(八)

    上一篇<Python 面向对象初级(七)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  4. python 面向对象(进阶篇)

    上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  5. python 面向对象编程学习

    1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...

  6. Python面向对象详解

    Python面向对象的"怜人之处" Python的待客之道--谁能进来 Python的封装--只给你想要的 Python的继承--到处认干爹 Python的多态--说是就是

  7. python 面向对象和类成员和异常处理

    python 面向对象 你把自己想象成一个上帝,你要创造一个星球,首先你要把它揉成一个个球,两个直径就能创造一个球 class star: '''名字(name),赤道直径(equatorial di ...

  8. python 面向对象学习

    ------Python面向对象初 下面写一个类的简单实用,以便方便理解类 #python 3.5环境,解释器在linux需要改变 #阅读手册查询readme文件 #作者:S12-陈金彭 class ...

  9. 初识python面向对象

    一.初识python面向对象: class Person: #使用class关键字定义一个类 age=0 #类变量(静态变量) def eat(self,food): #定义一个方法 self.age ...

  10. python 面向对象、特殊方法与多范式、对象的属性及与其他语言的差异

    1.python 面向对象 文章内容摘自:http://www.cnblogs.com/vamei/archive/2012/06/02/2532018.html   1.__init__() 创建对 ...

随机推荐

  1. 递归思维判断数组a[N]是否为一个递增数组

    递归的方法:记录当前最大的,并且判断当前的是否比这个还大,大则继续,否则返回false结束: bool fun( int a[], int n ) { ) { return true; } ) { ] ...

  2. thinkphp 实现分页

    一.一个条件的查询数据 查询数据自然是先要显示出数据,然后根据条件进行查询数据 (1)显示出表的数据 这个方法我还是写在了HomeController.class控制器文件中 (1.1)写了一个方法s ...

  3. Mac 软件专题:教学参考工具软件-外语/医学/天文/地理/数学等

    今天和大家分享mac软件专题:教学参考工具软件,在这个专题中,主要向大家推荐一些Mac上优秀的教育教学.知识参考类的软件,包含外语.医学.天文.地址.数学.音乐等方面,学生.老师以及相关的工作者不要错 ...

  4. Mysql连接查询、子查询、联合查询 整理

    连接查询 连接语法的基本形式 from 表1  [连接方式]  join 表2  [on 连接条件]: 交叉连接 语法: from  表1  [cross]  join  表2  ;      //可 ...

  5. 增删改查的SSM小项目

      经过将近一个月的摸索,终于算是勉强完成了关于增删改查的SSM项目. github源码地址:https://github.com/123456abcdefg/Login 好了,话不多说,写一下具体代 ...

  6. python如何直接控制鼠标键盘

    一.简介 我们知道在windows下输入:win + r,会弹出下面的窗口,而在下面的窗口出现后我们接着按下esc键,下面的窗口会消失 现在设想我们想在python代码里控制键盘,想通过运行代码-&g ...

  7. GlusterFS 分布式文件系统的使用入门-管理GlusterFS卷

    GlusterFS 分布式文件系统的使用入门-管理GlusterFS卷 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.卷的扩容 您可以根据需要在群集联机且可用时扩展卷.例如,您 ...

  8. python mysql 视图 触发器 事物 存储过程 用户授权 数据备份还原

    ###################总结########### 视图是一个虚拟表(非真实存在) 是跑在内存中的表,真实表是在硬盘上的表 使用视图我们可以把查询过程中的临时表摘出来,保存下来,用视图去 ...

  9. 【坑】zsh和oh-my-zsh卸载后导致无法登陆

    apt-get remove zsh 然后断开终端,就再也连不上了,崩溃啊! 以下登陆为www用户登陆 各种找,到这里 https://www.cnblogs.com/EasonJim/p/78630 ...

  10. 从虚拟机指令执行的角度分析JAVA中多态的实现原理

    从虚拟机指令执行的角度分析JAVA中多态的实现原理 前几天突然被一个"家伙"问了几个问题,其中一个是:JAVA中的多态的实现原理是什么? 我一想,这肯定不是从语法的角度来阐释多态吧 ...