类函数、成员函数、静态函数、抽象函数、方法伪装属性
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类函数、成员函数、静态函数、抽象函数、方法伪装属性相关的知识,希望对你有一定的参考价值。
参考技术A 本篇博客是滚雪球学 Python 第二轮的最后一篇博客,我们将内容继续提升到面向对象部分,为你补充类里面的一些装饰器,学习之后,希望你的 Python 基础知识可以更上一层楼。先直接看代码,再对代码内容进行分析与学习。
首先要掌握的是类函数的定义格式,在普通函数的前面添加装饰器 @classmethod ,该函数就会转换为类函数,同时函数的第一个参数默认是 cls ,该变量名可以任意,建议使用成 cls ,这个是程序员之间的约定。
在 Python 中,大部分 @classmethod 装饰的函数末尾都是 return cls(XXX) , return XXX.__new__ () 也就是 @classmethod 的一个主要用途是作为构造函数。
先掌握一个概念,静态函数不属于它所在的那个类,它是独立于类的一个单独函数,只是寄存在一个类名下,先建立这个基本概念,后面学起来就简单很多了。
在同一个类中,调用静态方法,使用 类名.函数名() 的格式。
先创建一个父类,其中包含两个静态函数与一个类函数。
再编写一个 S 类继承自 F 类:
测试之后,基本结论如下:
如果在子类中覆盖了父类的静态函数,那调用时使用的是子类自己的静态函数,
如果在子类中没有覆盖父类的静态函数,那调用时使用的是父类的静态函数,
类函数同样遵循该规则。
如果希望在子类中调用父类的属性或者函数,请使用 父类名. 的形式实现。
被 @abstractmethod 装饰的函数为抽象函数,含抽象函数的类不能实例化,继承了含抽象函数的子类必须覆盖所有抽象函数装饰的方法,未被装饰的可以不重写。
抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化,实现代码如下:
抽象基类中学习还需要了解元类相关知识,在第三轮滚雪球学 Python 中将为你展开这部分内容。
在 Python 面向对象的编码过程中, 对象.属性 来获取属性的值,使用 对象.方法() 来调用方法,通过装饰器 @property 可以将一个方法伪装成属性,从而使用 对象.方法 没有括号的形式调用。代码非常简单:
这种写法最直接的应用,就是将部分属性变成只读属性,例如,上述代码,你无法通过下述代码对 name 进行修改。
如果希望方法伪装的属性具备修改和删除功能,需要参考下述代码:
上述代码在将 name 方法伪装成属性之后,可以通过 @name.setter 和 @name.deleter 对同名的 name 方法进行装饰,从而实现了修改与删除功能。
所以一般使用方法伪装属性的步骤是:
如果你觉得这个比较麻烦,还存在一种方法伪装属性的方式。使用 property 函数,原型如下
通过上述函数将方法伪装成属性的代码为:
滚雪球学 Python 第二轮 15 篇博客在一次结束了,下一轮将在 4 月中旬再次开启,学 Python 我们一直在路上,希望本系列的课程对你的 Python 学习有所助力。
TypeScript核心篇——类(class)-可选参数-存取器-构造函数-静态属性方法-抽象类
传统的JavaScript程序使用函数和基于原型的继承来创建可重用的组件,
那么和es6一样的是class的继承和构造。
但不同的是typescript又多了以下属性,模仿java,c#面向对象构建出来三个修饰符 public protected private
:功能和java,c#基本一致,实现了面向对象式的发展。
class Box
public a:number=1;
protected b:number=2;
private c:number=3;
public play():void
console.log(this.a);
console.log(this.b);
console.log(this.c);
this.run();
this.jump();
protected run():void
private jump():void
var p = new Box();
公共,私有与受保护的修饰符public private protected
默认为public
* | public | protected | private | * |
---|---|---|---|---|
实例化对象 | 可以调用 | 不可调用 | 不可调用 | public是对外暴露的 |
在当前类中 | 可以调用 | 可以调用 | 可以调用 | |
继承后的子类中 | 可以调用 | 可以调用 | 不可调用 | 私有属性和方法不能在子类中调用 |
override 父类方法 | 可以重写 | 可以重写 | 不可以重写 | |
接口继承类 | 可以继承 | 不可以继承 | 不可以继承 | 只有全部都是public 属性方法的类才可以被接口继承 |
-
优先设定类中的属性和方法都是
private(私有的)
-
当需要继承时,并且需要通过继承后进行调用和覆盖重新方法时,需要调用和覆盖的方法属性,在父类中改为
protected受保护的
-
然后子类在调用这些方法属性时都使用
protected(受保护的)
-
当需要将类中属性和方法暴露在外,实例化对象可以调用的,修改为public 设置为公有的
可选参数
如果类中的属性设置类型并不包含undefined或者并不是可选属性,必须设置初始值,或者在构造函数中设置该值;
?:
可选属性
函数的参数中可以使用可选参数,必须写在必填参数后面,初始值参数可以放在可选参数后面
接口中可以使用可选参数
类中也可以使用可选参数
?.
当对象是一个可选属性时,调用对象的属性需要先判断这个对象是否赋值为对象了,还是undefined
if(this.obj)
this.obj.a=10;
console.log(this.obj?.a)
可以将这种方式简略为 this.obj?.a
存取器
class Box
private _step:number= 1;
constructor()
// 存取器中set方法不要设置返回类型,参数必须要设置类型
public set step(value:number)
this._step = value;
// 存取器中get方法必须要设置返回类型
public get step()
return this._step;
var b = new Box();
构造函数
构造函数不能设置返回值
构造函数可以使用private和protected 设置,但是如果这样设置就无法在外面new这个构造函数了,
(单例模式要用)
class Box
private constructor()
var b:Box=new Box(); //:Box 不能设置
静态属性和方法
静态属性可以不用设置初始值
当调用静态属性和方法时,通知都是使用类名调用
禁止在静态方法中使用this,虽然可以使用,但是这里强调大家不要使用,以防止和实例方法中this的区分
class Box
public static a:number;
private static b:number;
protected static c:number;
public static play():void
// this.a
// Box.a
Box.play();
console.log(Box.a)
抽象类
这个抽象类是不能实例化的
抽象类的作用是作为基类使用,用来继承的
接口中是完全没有实现任何功能,只有方法名和属性名
在抽象类实现了部分方法的功能,并且设置了一些类似接口的方法名和属性名
在继承抽象类后,由个子类分别实现
abstract class Box
public a:number=1;
public abstract update():void;
public abstract b:number;
public play():void
console.log("aaa")
protected run():void
console.log("bbb");
class Ball extends Box
public b: number=1;
public update(): void
以上是关于类函数、成员函数、静态函数、抽象函数、方法伪装属性的主要内容,如果未能解决你的问题,请参考以下文章