Python语法 36——42




最近读了GitHub上一个完工项目:https://github.com/leisurelicht/wtfpython-cn#structure-of-the-examples%E7%A4%BA%E4%BE%8B%E7%BB%93%E6%9E%84

简单总结: 类方法访问类属性:cls.xxxx , 实例方法访问实例属性:self.xxxx



1. 私有属性、私有方法
2. 继承,python支持多继承哦

3. 子类无法调用父类的私有属性、私有方法

4. MRO,多继承时候用来查看一个类的方法调用路径、顺序

5. 以object为基类的新式类,以后都这样定义一个类

6. 多态

7. 类属性、类方法、静态方法




1. 私有属性和私有方法

    ① 在属性或方法名前面加俩下划线__ 就形成了私有

    ② 虽然是类私有的属性或者方法,但还是可以在类的外部访问,但是在实际工作中不推荐使用,即 “对象.__类名__私有方法或属性”,这样就能调用了:

    happysneaker.com





2. 继承 ( 代码重用 )


    ① 继承的语法:很简单,比如说父类是animal,子类是dog,继承: class dog(animal): 这样就继承了:

    happysneaker.com

    happysneaker.com

    ② 继承具有传递性,不用多说;

    ③ 重写(override),重写分为两种情况:

                第一种:覆盖:说明子类的方法与父类中已有的方法所实现的功能完全不同,只需要在子类中定义一个同名方法然后进行编写即可,比如小狗叫和大狗叫完全不同;

                第二种:扩展:说明父类的方法中有子类的方法所需要的功能,只需要对父类的方法进行功能扩展即可,做法是:在子类中同样定义一个同名方法,然后正常写功能,然后到了需要调用父类同名方法的功能时,用 super().父类方法()

这种形式来调用。

      happysneaker.com

 


    调用父类方法的两种方式:

    ① super() 本身就是一个对象,python中这种格式一般都是一个对象, 所以 super() 可以作为一个对象来进行调用父类方法。

    ② 父类名.方法名()  : 其他语言大多用这种方法,但是python中不推荐,要使用 ① 这种方法。

    



3. 针对父类的 私有属性、私有方法 做补充

    happysneaker.com

    "子类不能调用父类的私有属性和私有方法,

      但是可以调用公有属性和公有方法,

      因此可以通过调用公有方法来间接使用私有属性。"




4. 

class A():

      嘻嘻嘻嘻嘻嘻

      print(A.__mro__)


__mro__ 属于类的属性。


了解即可。




5. 新式类、经典类

简单说就是以后编写类的时候,如果类没有父类的话,统一继承object类即可,object类是所有类的基类。

class B (object):

      xxxx


a = B()

dir(a) 查看对象a有哪些方法和属性,即可发现以object类为基类的新式类,有更多基础方法和属性可以供调用。


以后推荐使用新式类,主动指定object类,方便代码兼容python2,3



6.多态

不同子类对象调用相同的父类方法,产生不同的效果,其实是不同子类对象针对需要对父类方法进行了重写。




7. 类属性、类方法

类属性

每一个对象或者说实例,都有自己的内存空间,用于保存各自的属性。

Python中万物皆对象,一个类也可以是一个类对象。如下,输出2:__init__(self,xxx)即构造方法,每次实例化对象都会被调用:所以下面的count即类的属性,下面的代码即可统计类实例化了多少个对象。


happysneaker.com

所以访问一个类的属性有两种方法:

类名.属性名

对象.属性名(不推荐,比如需要赋值的时候: 对象.属性名 = 33 ,这个并不会改变类属性的值,而是给这个对象新建了一个属性)


类方法

happysneaker.com

① 定义的时候需要用 @classmethod 来进行标识,然后 def 类方法名(cls):   注意括号内的第一个参数习惯上一定是cls。

② 在类方法的内部,可以通过cls.访问类属性,当然也可以通过cls.调用其他的类方法,毕竟类方法可能不只有一个。


举例:

happysneaker.com



静态方法:

如果一个方法既不访问类属性,也不实用实例属性,那就是静态方法,使用的时候同样是在定义方法的上方用修饰符进行说明,而且静态方法的参数里不用写 self


@staticmethod

def xxx():

      pass


调用的时候:

类名.静态方法 ,而不用对象调用


综合:

happysneaker.com

happysneaker.com

可以理解 静态方法和类方法 都是通过 类名.方法 的方式调用,而实例方法需要通过对象调用。因此需要先实例化一个对象。

happysneaker.com


所以当一个方法既访问类属性,又访问实力属性,那么这个方法应该定义为 实例方法,因为实例方法即可以访问实例属性,有可以访问类属性,实例方法内部调用类属性: 类名.属性名 , 即可。




Web安全技术分享
请先登录后发表评论
  • 最新评论
  • 总共0条评论