
Python 面向对象 继承 多重继承 类 类对象 实例对象 绑定
子类可以继承父类的所有属性和方法。如果子类定义了与父类相同名字的属性或方法,则子类的属性或方法会覆盖父类的对应属性或方法,但不会影响父类的属性和方法。 在子类中,如果需要调用父类的方法,可以通过未绑定方式(即不使用`self`传递对象)直接调用父类的方法。这种方式适用于需要在子类中初始化对象时。
发布日期:2021-05-07 23:05:29
浏览次数:20
分类:精选文章
本文共 3068 字,大约阅读时间需要 10 分钟。
文章目录
继承
Python面向对象编程的核心特征之一是继承关系。通过使用继承语法,我们可以定义新类继承已有的类,从而继承其属性和方法。例如,使用以下代码可以创建一个继承自`BaseClassName`的子类`DerivedClassName`:
class DerivedClassName(BaseClassName): pass
继承关系具有以下几个特点:
import random as rclass Fish(): def __init__(self): self.x = r.randint(1,10) self.y = r.randint(1,10) def move(self): self.x += 1class Shark(Fish): def __init__(self): self.hungry = True Fish.__init__(self) #保留鲨鱼的位置,调用Fish类的初始化方法 def eat(self): if self.hungry: print("eat") self.hungry = False else: print("eaten")
- 在多继承的情况下,使用`super()`函数可以自动查找并调用父类的方法,无需显式指定父类名称。这在处理多个父类时非常便利。
- 组合方法适用于将多个类的实例化对象组合到一个新类中,这种方式不需要类之间有直接或间接的继承关系。
- 纵向组合(即一个类继承另一个类)需要使用继承关系,而横向组合(即两个类没有直接或间接的继承关系)则适合使用组合方法。
- 类是用来定义对象类型的蓝图,类中的属性是静态的,属于类本身,而不是实例。
- 类对象(如`DerivedClassName`)是类本身的实例化对象,包含类的属性和方法。类对象可以被赋值给变量,例如:
- 实例对象(如`my_object = my_class()`)是类对象的实例化对象,包含类属性和方法的具体值。类属性和方法在实例对象上会被动态绑定。
- 如果实例对象和类对象有相同的属性或方法名称,实例对象的属性会覆盖类对象的属性。这是Python的动态绑定机制的特点之一。
- 不要试图在一个类中定义所有可能的属性和方法。尽量利用继承和组合的原则来扩展类。
- 使用不同词性名称命名类的属性和方法,以避免命名冲突。例如,属性使用名词,方法使用动词。
- 方法的第一个参数必须是`self`,否则会导致绑定错误。
- 使用`self`跟踪与类相关的属性和值。
(1) 多重继承
class DerivedClassName(Base1, Base2, Base3, ...): pass
通过多重继承,可以将多个类的属性和方法继承到一个子类中。然而,在多重继承中,如果多个父类中定义了相同名称的方法,子类只会继承第一个父类的方法。
>>> class A(): def print1(self): print("A")>>> class B(): def print1(self): print("B")>>> class C(A, B): pass>>> c = C()>>> c.print1()A
(2) 组合方法
class Turtle(): def __init__(self, x): self.num = xclass Fish(): def __init__(self, y): self.num = yclass Pool(): def __init__(self, x, y): self.turtle = Turtle(x) # 组合Turtle类的实例化对象 self.fish = Fish(y) # 组合Fish类的实例化对象 def print_num(self): print("池里有鱼%d有甲鱼%d" % (self.turtle.num, self.fish.num))
===========
类、类对象和实例对象
在Python中,一个类定义完成后会成为一个类对象。类对象包含类的属性和方法。当我们使用`class DerivedClassName(BaseClassName): pass`语句创建一个新类时,`DerivedClassName`实际上是一个指向类对象的引用。
my_class = DerivedClassName()
class C(): def x(self): print("Python")>>> c = C()>>> c.x()Python>>> c.x = 1>>> c.x1>>> c.x()Traceback (most recent call last): File " ", line 1, in c.x()TypeError: 'int' object is not callable
注意事项:
绑定
在Python中,方法必须与实例对象绑定才能被调用。这就是所谓的绑定机制。例如:
>>> class A(): def print1(): print("A")>>> a = A()>>> a.print1()Traceback (most recent call last): File " ", line 1, in a.print1()TypeError: print1() takes 0 positional arguments but 1 was given
>>> class A(): def setxy(self, x, y): self.x = x self.y = y def printxy(self): print(self.x, self.y)>>> a = A()>>> a.__dict__{ }>>> A.__dict__mappingproxy({ '__module__': '__main__', 'setxy': , 'printxy': , '__dict__': , '__weakref__': , '__doc__': None})>>> a.setxy(1, 2)>>> a.__dict__{ 'x': 1, 'y': 2}>>> del A>>> a.printxy()1 2>>> a.__dict__{ 'x': 1, 'y': 2}
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年05月06日 21时28分40秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
pair的用法
2019-03-09
Flex 布局的自适应子项内容过长导致其被撑大问题
2019-03-09
PL/SQL 动态Sql拼接where条件
2019-03-09
【自学Flutter】4.1 Material Design字体图标的使用(icon)
2019-03-09
【换行符】什么时候用cin.get()吃掉输入流中的换行符
2019-03-09
广东外语外贸大学第三届网络安全大赛Writeup
2019-03-09
SpringBoot使用RedisTemplate简单操作Redis的五种数据类型
2019-03-10
Thymeleaf sec:authorize 标签不生效
2019-03-11
微信JS-SDK DEMO页面和示例代码
2019-03-11
一张图搞定RPC框架核心原理
2019-03-11
他来了他来了,他带着云栖大会的免费门票走来了
2019-03-11
获取linux 主机cpu类型
2019-03-11
Flask--简介
2019-03-11
16 python基础-恺撒密码
2019-03-11
Frame--Api框架
2019-03-11
Boostrap技能点整理之【网格系统】
2019-03-11
javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层
2019-03-11