类函数、成员函数、静态函数、抽象函数、方法伪装属性

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

*publicprotectedprivate*
实例化对象可以调用不可调用不可调用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 
        
    

以上是关于类函数、成员函数、静态函数、抽象函数、方法伪装属性的主要内容,如果未能解决你的问题,请参考以下文章

2017-04-16抽象类接口构造函数重载静态成员和方法

2017-4-16 多态 构造函数 方法重载 静态方法和静态成员

Python面向对象 -没有对象?new一个吧

python成员函数如何调用静态函数

关于纯抽象类中的静态成员函数 - 设计模式?

访问静态成员函数中的非静态成员的解决方法