Python基础之面向对象编程(二)

本篇文章主要介绍面向对象编程。

面向对象编程

几个定义

  • 面向过程编程:围绕函数,编写能处理数据的代码块的编程方式。
  • 类、对象:面向对象编程的两个主要方面。一个类(Class)能创建一种新的类型;对象(Object)是类的实例。可这样类比:你可拥有类型 int 的变量,也即,存储整数的变量是 int类 的对象实例。
  • 字段、方法和属性:从属于对象或类的变量叫字段(Field);对象调用从属于类的函数实现某些功能,这些函数叫类的方法(Method);字段和方法统称为累的属性(Attribute)。

Tips: 不同于静态语言,Python 中即使是整数也会被视为对象(int类的对象),同 Java 中装箱与拆箱概念颇为相似。

类和对象

最简单的类结构如下所示:

class Student(object):
    pass # 一个空的代码块

# 创建类对象实例
student = Student()
print(student)  
# 打印:<__main__.Student object at 0x101985f28>   

*Tips: *

  • Python 中所有类均继承自 object;
  • Python 打印对象,默认可查看对象地址。Python 会在它找到的任何空间来存储对象。
类属性和实例属性

方法(Method)

Python 对比于 Java 类方法属性,有两个特殊点:

  • 类中定义的所有方法,第一个参数必须是 self;相当于 Java 中的 this 引用;
  • _init_() 方法:在类的对象被实例化时立即运行;相当于 Java 中的构造方法。
    Tips: Python中不存在方法的重载,方法的重载是对同一个方法使用可变参数来实现,这在后面函数参数这块会提到。

示例代码如下:

class Student(object):
    count = 0  # 类变量

    def __init__(self, name):
        self.name = name  # 实例变量
    
    def say_hi(self):
        print(r'Hello, I'm', self.name)
        
student = Student('Coral')  
student.say_hi()  
# 打印:Hello, I'm Coral

字段(Field)

Python 中字段有两种类型——类变量与对象变量,对比上述示例代码,两者的区别点如下图所示:


类变量和实例变量区别.png

因为 Python 是动态语言,可以给类创建的实例动态绑定属性,那么如何给 实例 绑定属性?如何给 类 绑定属性呢?

1)给实例绑定属性

  • 通过在 _init_ 方法中给 self 绑定属性,这种属性所有对象实例均可访问;
  • 直接给实例绑定,这种属性只适用于该实例,其他实例不能访问该属性。如:
student = Student('Coral')
# grade是给实例动态绑定的属性,name是通过 self绑定的属性
student.grade = 90 
print('{} grade = {} '.format(student.name, student.grade)) 

student2 = Student('Jane')
print(student2.grade)
# 这句会抛出:AttributeError: 'Student' object has no attribute 'grade'

2)给类绑定属性
要让同一个字段属性对所有实例均适用,除了 self 绑定,还可以适用 类属性。

  • 类属性,直接在 class 中定义属性,归整个 Student 类所有,如 count 字段。

Tips: 当 实例属性 和 类属性 同名时,实例属性 优于 类属性,也即,实力属性会覆盖类属性,所以在项目中要避免使用这种同名变量。

访问限制

Java 中有四种访问修饰符,Python 中并没有指定具体的访问修饰符,仅是按照一种约定的写法来,如下图所示:


访问限制.png
获取对象信息

在 Java 中通常会判断一个对象是什么类型,用 instanceOf 来判断,Python 中也有判断对象类型的方法,还可以获取对象拥有的属性和方法,这些都是 Python 内置的方法。常见的如下图所示:


获取对象信息方法.png

这里重点说下 isinstance() 方法,示例如下:

a = list() # a 是 list 类型
b = Animal() # b 是 Animal 类型
c = Dog()  # c 是 Dog 类型

# 1.判断一个变量是否是某个类型可以用 isinstance() 判断:
print('a is list:', isinstance(a, list))     # True
print('b is Animal:', isinstance(b, Animal)) # True
print('c is Dog:', isinstance(c, Dog))       # True
print('c is Animal:', isinstance(c, Animal)) # True

# 2. 能用 type() 判断的基本类型也可以用 isinstance() 判断:
print(isinstance('a', str))    # True
print(isinstance(123, int))    # True
print(isinstance(b'a', bytes)) # True

# 3. 另外,isinstance() 还可以判断一个变量是否是某些类型中的一种:
# 判断变量是否是 list 或 tuple.
def is_list_or_tuple(x):
    return isinstance(x, (list, tuple))

Tips: 区别于 type,对于 class 继承关系,不便使用 type();要判断 class 类型,使用 isinstance() 函数。因为 type() 只能返回对象本身的类型,比如 type(dog) != type(animal), 但是 isinstance(dog, Dog) = isinstance(dog, Animal)。

继承和多态

Python 中允许多继承,没有接口实现的概念。继承和多态总结点如下:


继承和多态.png

Python 中没有方法的重载,但是存在方法的覆盖,子类可以覆盖父类方法,也适用于运行时绑定传入的实例。

关于继承的几个问题
  1. 子类 能否继承 父类绑定的 属性?(每个类通过 self 或者 给实例动态绑定的 属性都是该类实例 独立拥有,跟子类没有任何关联?)
    A: 子类不能继承 父类中通过 self或者 动态绑定的属性;
  2. 子类 是否只能继承 父类绑定的 类属性?
    A:子类能继承 父类中的 类属性,在操作该类属性时,使用 ChildClass.property 访问该类属性;
  3. 子类可以继承 父类的所有方法?
    A:Python 中方法没有 访问限制符修饰;
  4. 每个类通过 self 或者 给实例动态绑定的 属性都是该类实例 独立拥有,跟子类没有任何关联?
    A:是。
  5. 子类和父类有同名的 属性,优先使用哪个?(避免这种情况,直接继承使用父类的属性)
    A:子类优先,但最好不要让子类属性和父类属性同名 。
  6. 子类能否继承父类中 __xxx 隐藏属性?
    A:这个可以看做是每个类通过 self 绑定的属性均属于本类所有,父类中通过 self 绑定的属性不管是否是隐藏属性,子类直接访问就会抛出:AttributeError: 'Dog' object has no attribute '_BaseClass__name' .
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容