python学习笔记6.1-类的认识

前言

都在说,在Python中“无所不对象”,是因为Python是一个面向对象的动态编程语言,因而它具有:多态(Polymorphism),继承(Inheritance)和封装(Encapsulation)的性质。在讨论面向对象之前,先了解一些面向对象(OPP)的相关术语。

  • 类:对具有相同数据和方法的一组对象的描述或定义。
  • 对象:对象是一个类的实例。 实例(instance):一个对象的实例化实现。
  • 实例属性(instance attribute):一个对象就是一组属性的集合。
  • 实例方法(instance method):所有存取或者更新对象某个实例一条或者多条属性的函数的集合。
  • 类属性(class attribute):属于一个类中所有对象的属性,不会只在某个实例上发生变化。
  • 类方法(class method):那些无须特定的对性实例就能够工作的从属于类的函数。

1 怎么理解面向对象

一般而言,计算机是不可能去‘客观’的理解事物,计算机唯一能做的就是将数据储存起来并进行一系列的操作。因而在利用计算机描述事物的时候,首先我们必须将事物抽象化,这个过程也就是提取事物的特征。这个 特征包括属性(一些参数,数值)以及方法(一些行为,他能干什么!)。每个人都有身高、体重、年龄、血型等等一些属性。人会劳动、人都会直立行走、人都会 用自己的头脑去创造工具等等这些方法!人之所以能区别于其它类型的动物,是因为每个人都具有人这个群体的属性与方法。“人类”只是一个抽象的概念,它仅仅 是一个概念,它是不存在的实体!但是所有具备“人类”这个群体的属性与方法的对象都叫人!这个对象“人”是实际存在的实体!每个人都是人这个群体的一个对 象。老虎为什么不是人?因为它不具备人这个群体的属性与方法,老虎不会直立行走,不会使用工具等等!所以说老虎不是人!

由此可见——-类描述了一组有相同特性(属性)和相同行为(方法)的对象。在程序中,类实际上就是数据类型!例如:整数,小数等等。整数也有 一组特性和行为。面向过程的语言与面相对象的语言的区别就在于,面向过程的语言不允许程序员自己定义数据类型,而只能使用程序中内置的数据类型!而为了模 拟真实世界,为了更好的解决问题,往往我们需要创建解决问题所必需的数据类型!面向对象编程为我们提供了解决方案。

2 Python中类的定义

其中直接定义在类体中的变量叫类变量,而在类的方法中定义的变量叫实例变量。类的属性包括成员变量和方法,其中方法的定义和普通函数的定义非常类似,但方法必须以self作为第一个参数。

类的属性分为公有属性和私有属性,对应的方法也有一些区别:
  • 类的私有属性:   private_attrs 两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs 类的方法   在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数 私有的类方法   __private_method 两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用slef.__private_methods

类的专有方法:

__init__ 构造函数,在生成对象时调用 __del__ 析构函数,释放对象时使用 __repr__ 打印,转换 __setitem__ 按照索引赋值 __getitem__ 按照索引获取值 __len__ 获得长度 __cmp__ 比较运算 __call__ 函数调用 __add__ 加运算 __sub__ 减运算 __mul__ 乘运算 __div__ 除运算 __mod__ 求余运算 __pow__ 幂运算

Python中类的定义的语法格式是:

class 类名:
    属性
    方法

例如:

import os

print('\033[32m',__doc__)
print('\033[0m')
os.chdir(r'd:\home')
path = os.getcwd()

class people():
    #属性
    sex = '' #性别
    name = ''

    _hei = 0     #身高
    _wei = 0     #体重
    _age = 0     #年龄
    #操作
    def __init__(self,s,n,h,w,a): #构造函数
        self.sex = s
        self.name = n
        self._hei = h
        self._wei = w
        self._age = a

    def getage(self):
        return self._age

libai = people('man','libai',155,87,34)    
print(libai.sex)  
print(libai.getage()) 

运行之后的输出结果:

可以看到在调用类的属性的时候: 实例名.属性名 在调用类的方法的时候: 实例名.方法()

怎么去查看类有哪些可以利用的属性和方法呢,语法格式如下:

dir(object)
for example:
dir(people)

dir(libai)

python 中类的继承

Python同时支持单继承与多继承,继承的基本语法为class新类名(父类1,父类2,..),当只有一个父类时为单继承,当存在多个父类时为多继承。子类会继承父类的所有的属性和方法,子类也可以覆盖父类同名的变量和方法。在传统类中,如果子类和父类中同名的方法或者属性,在查找的时候基本遵循自左到右,深度优先的原则。

class 子类名(父类1,父类2,.....)

例如:

import os

print('\033[32m',__doc__)
print('\033[0m')
os.chdir(r'd:\home')
path = os.getcwd()

#class people
class people():
    #属性
    sex = '' #性别
    name = ''

    _hei = 0     #身高
    _wei = 0     #体重
    _age = 0     #年龄
    #操作
    def __init__(self,sex,name,height,weight,age): #构造函数
        self.sex = sex
        self.name = name
        self._hei = height
        self._wei = weight
        self._age = age

    def getage(self):
        return self._age

#class school
class school:
    croom = ' '
    sID = '000'

    def __init__(self,classroom,studentID):
        self.croom = classroom
        self.sID = studentID


#class student
class student(people,school):
    grade = 0.0

    def __init__(self,sex,name,height,weight,age,classroom,studentID,grade):
        people.__init__(self,sex,name,height,weight,age)
        school.__init__(self,classroom,studentID)
        self.grade = grade

    def setgrade(self,grade):
        self.grade = grade
    def setsID(self,studentID):
        school.sID = studentID



libai = people('man',name = 'libai',age = 34,height = 144,weight = 45) 
liming = student('man','liming',155,55,23,'五年级','123',54)  

liming.sID = '234'
print(liming.sID)
print(libai.sex)  
print(libai.getage())
print(liming.getage()) 

1 需要注意的是子类的构造函数有以下几种情况:

  • 1 如果子类没有定义自己的构造函数,父类的构造函数会被默认调用,但是此时如果要实例化子类的对象,则只能传入父类的构造函数对应的参数,否则会出错。
  • 2 如果子类定义了自己的构造函数,而没有显示调用父类的构造函数,则父类的属性不会被初始化。
  • 3 如果子类定义了自己的构造函数,显示调用父类,子类和父类的属性都会被初始化。(例如上面的代码就是显式初始化了父类的构造函数)

2 属性的继承顺序

Python类多继承的原则是:自左到右,深度优先 深度优先,从左到右遍历基类,先遍历高level的,再遍历低level的,如果任何类在搜索中是重复的,只有最后一个出现的位置被保留,其余会从MROlist中删除。也就是说类的共同的祖先只有在其所有的子类都已经被check之后才会check

要查找对象x的attr属性,其根据自左到右,深度优先的原则,其搜索顺序为D,B,A,C,位于树结构底层的节点具有较高的level,当从高的level向低的level查找的时候遇到第一个属性则不再继续查找,因此上面的例子x的属性值为1. (这一块有待于深入研究) 感谢博文:http://blog.csdn.net/carolzhang8406/article/details/6903556

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏恰同学骚年

剑指Offer面试题:16.合并两个排序的链表

PS:这也是一道出镜率极高的面试题,我相信很多童鞋都会很眼熟,就像于千万人之中遇见不期而遇的人,没有别的话可说,唯有轻轻地问一声:“哦,原来你也在这里? ”

541
来自专栏彭湖湾的编程世界

【JavaScript】 JS面向对象的模式与实践

参考书籍 《JavaScript高级语言程序设计》—— Nicholas C.Zakas 《你不知道的JavaScript》  —— KYLE SIMPSON ...

3516
来自专栏程序猿DD

第五章 正则表达式的拆分【修订】

本篇文章本不该存在,因小编的失误出现了一些错误,应作者要求,修正昨天同名文章的两处错误。 第五章 正则表达式的拆分 对于一门语言的掌握程度怎么样,可以有两个角度...

1926
来自专栏青玉伏案

在Objective-C中浅谈面向对象

  接触面向对象也有一段时间了,当时是通过C++学习的OOP,后来又接触到了PHP和Java。每种OOP的语言在面向对象上或多或少都会有不同的地方,现在在学习O...

1786
来自专栏CDA数据分析师

Python面试中8个必考问题

1、下面这段代码的输出结果是什么?请解释。 ? 怎样修改extendList的定义能够产生以下预期的行为? 上面代码输出结果将是: ? 很多人都会误认为list...

19010
来自专栏和蔼的张星的图像处理专栏

212. 空格替换先扩充,从后往前处理

设计一种方法,将一个字符串中的所有空格替换成 %20 。你可以假设该字符串有足够的空间来加入新的字符,且你得到的是“真实的”字符长度。 你的程序还需要返回被替...

712
来自专栏布尔

想起温习一下JS中的this apply call arguments

很多时候讲到语言入门,大家会认为就是要了解一下语言的语法、数据类型和常用函数。这一课对于所有的计算机专业的毕业生来说都可以自学,然而在最近的实践中(带了两个实习...

20310
来自专栏PHP实战技术

解构赋值,你不能不懂!

14110
来自专栏从流域到海域

《Java程序设计基础》 第6章手记

本章主要内容: - 类的定义 - 成员变量和成员方法 - 类及成员的修饰符 - 对象的创建与使用 - 成员变量的访问与方法的...

1905
来自专栏达摩兵的技术空间

a>b的那些事

经常会遇到对比两个值大小关系的逻辑,常规的处理中我们都是处理两个数字或者数字类型的字符串。那么这里进行延伸拓展的练习,来避免一些开发中的采坑。

641

扫码关注云+社区