类与继承

Posted chen-tan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类与继承相关的知识,希望对你有一定的参考价值。

注意

类名后面跟着小括号,这与调用函数是一样的,所以在Python中,类名约定用大写字母开头,函数用小写字母开头,这样更容易区分。另外赋值操作并不是必需的,但如果没有把创建好的实例对象赋值给一个变量,那这个对象就没办法使用,因为没有任何引用指向这个实例,最终会被Python的垃圾收集机制自动回收。

self

Python的self其实就相当于C++的this指针。

魔法方法

通常把__ init__ ()方法称为构造方法,__ init__ 方法的魔力体现在 只要实例化一个对象,这个方法就会在对象被创建时自动调用(在C++里也可以看到类似的东西,叫"构造函数”)。其实,实例化对象时是可以传入参数的,这些参数会自动传入__ _init__ _0方法中,可以通过重写这个方法来自定义对象的初始化操作。

私有化

在Python中定义私有变量只需要在变量名或函数名前加上“_” 两个下画线,那么这个函数或变量就会成为私有的了:Python目前的私有机制其实是伪私有,Python的类是没有权限控制的,所有变量都是可以被外部调用的。

继承

语法:

class 类名 (被继承的类) : 

重写:

需要注意的是,如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性:

重写构造方法:

重写__ _init__ 方法的时候先调用基类Fish的__ _init__ 方法。 下面介绍两种可以实现的技术:

调用未绑定的父类方法。

这里需要注意的是,这个self并不是父类的实例对象,而是子类实例对象,所以,这里说的未绑定是指并不需要绑定父类的实例对象,使用子类的实例对象代替或使用super函数。

class 类名 (被继承的类) :
   def __init__(self):
       被继承的类 .__init__(self)
       其他属性
使用super函数。
class 类名 (被继承的类) :
   def __init__(self):
       super().__init__(self)
       其他属性
python支持多重继承
class 类名 (父1, 父2 ,父3,。。。)

但多重继承很容易导致代码混乱,所以当不确定是否必须使用多重继承的时候,请尽量避免使用它,因为有些时候会出现不可预见的BUG。

组合

假设已有乌龟和鱼类,要求定义一个类,水池,要有乌龟和鱼

在Python里其实很简单,直接把需要的类放进去实例化就可以了,这就叫组合:

例:

class Turtle:
def __init__ (self,x) :
self .num = x
class Fish:
def __init__(self,x) :
self.num = x
class Pool :
   def __init__(self, X, y) :
self.turtle=Turtle(x)
       self.fish=Fish(y)
   

注意事项

如果属性的名字与方法名相同,属性会覆盖方法:

定义注意

类的定义要“少吃多餐”,不要试图在一个类里边定义出所有能想到的特性和方法,应该利用继承和组合机制来进行扩展。用不同的词性命名,如属性名用名词、方法名用动词,并使用骆驼命名法。骆驼式命名法(CamelCase)又称驼峰命名法,是电脑程式编写时的一套命名规则(惯例)。正如它的名称CamelCase所表示的那样,是指混合使用大小写字母来构成变量和函数的名字,程序员为了自己的代码能更容易在同行之间交流,所以多采取统--的可读性比较好的命名方式。

以上是关于类与继承的主要内容,如果未能解决你的问题,请参考以下文章

java学习笔记3(datawhale教程)

javaScript闭包实现类与继承(非ES6)

抽象类与接口区别

用于预定义类创建的元类与继承

Java类与继承

Java:类与继承