Day5—面向对象

Posted

tags:

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

本节内容:

  • 面向对象高级语法部分

       经典类vs新式类  

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

    类的特殊方法

    反射

  • 异常处理
  • Socket开发基础

 

面向对象高级语法部分

 

经典类vs新式类

把下面代码用python2 和python3都执行一下

class A:
    def __init__(self):
        self.n = ‘A‘
 
class B(A):
    # def __init__(self):
    #     self.n = ‘B‘
    pass
 
class C(A):
    def __init__(self):
        self.n = ‘C‘
 
class D(B,C):
    # def __init__(self):
    #     self.n = ‘D‘
    pass
 
obj = D()
 
print(obj.n)

 

classical vs new style:

  在Python2 中,经典类是按照深度优先来继承的,新式类是按广度优先来继承的

  在python3 中,经典类、新式类都是按照广度优先来继承的

 

静态方法

通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法

class Dog(object):
 
    def __init__(self,name):
        self.name = name
 
    @staticmethod #把eat方法变为静态方法
    def eat(self):
        print("%s is eating" % self.name)
 
 
 
d = Dog("ChenRonghua")
d.eat()

上面的调用会出以下错误,说是eat需要一个self参数,但调用时却没有传递,没错,当eat变成静态方法后,再通过实例调用时就不会自动把实例本身当作一个参数传给self了。 

Traceback (most recent call last):
  File "/Users/jieli/PycharmProjects/python基础/自动化day7面向对象高级/静态方法.py", line 17, in <module>
    d.eat()
TypeError: eat() missing 1 required positional argument: ‘self‘

 

想让上面的代码可以正常工作有两种办法

1. 调用时主动传递实例本身给eat方法,即d.eat(d) 

2. 在eat方法中去掉self参数,但这也意味着,在eat中不能通过self.调用实例中的其它变量了

class Dog(object):

    def __init__(self,name):
        self.name = name

    @staticmethod
    def eat():
        print(" is eating")



d = Dog("ChenRonghua")
d.eat()

 

 

 

以上是关于Day5—面向对象的主要内容,如果未能解决你的问题,请参考以下文章

Day5-1 面向对象和面向过程

VSCode自定义代码片段——JS中的面向对象编程

VSCode自定义代码片段9——JS中的面向对象编程

day5

python day5

day5模块