美文网首页算法实习生
关于python中面向对象编程的注意点

关于python中面向对象编程的注意点

作者: STACK_ZHAO | 来源:发表于2019-07-12 21:50 被阅读0次

    类内部的私有属性的修改与访问

    关于class里面的对象的私有以及受保护的问题,有时候在一个类里面直接把数据设置成公有的属性的时候是有很多问题的,所以需要对属性对属性进行特殊的设置,再python里面有@property装饰器@_.setter修改器,对私有属性进行对应的操作/

    class Person(object):
    
        def __init__(self, name, age):
            self._name = name
            self._age = age
    
        # 访问器 - getter方法
        @property
        def name(self):
            return self._name
    
        # 访问器 - getter方法
        @property
        def age(self):
            return self._age
    
        # 修改器 - setter方法
        @age.setter
        def age(self, age):
            self._age = age
    
        def play(self):
            if self._age <= 16:
                print('%s正在玩飞行棋.' % self._name)
            else:
                print('%s正在玩斗地主.' % self._name)
    
    
    def main():
        person = Person('王大锤', 12)
        person.play()
        person.age = 22
        person.play()
        # person.name = '白元芳'  # AttributeError: can't set attribute
    
    
    if __name__ == '__main__':
        main()
    

    这个例子里面的,就是对property以及setter的解释,同时注意一点,你在暗示这个属性是私有的时候,默认的是在类里面的某个属性下面下一个_,比如在这里面的name,与age,在实现初始化的时候都是self._name等。

    对类里面的属性的绑定

    python是一门动态的语言,所以它可以定义一个object对象,然后给这个对象绑定各种属性,但是如果这个属性是不作限制的话,在多个类里面如果调用了同一个名称不同内容的属性,那么在代码运行的时候会造成很大的麻烦,那么如何去解决这个问题呢,这个时候就用到了python里面的函数slots,即用这个来指明类里面只能绑定什么属性。但是这个仅仅只会对该类起作用,不会对子类起作用。
    eg.

    class Person(object):
    
        # 限定Person对象只能绑定_name, _age和_gender属性
        __slots__ = ('_name', '_gender')
    
        def __init__(self, name, age):
            self._name = name
            self._age = age
    
        @property
        def name(self):
            return self._name
    
        @property
        def age(self):
            return self._age
    
        @age.setter
        def age(self, age):
            self._age = age
    
        def play(self):
            if self._age <= 16:
                print('%s正在玩飞行棋.' % self._name)
            else:
                print('%s正在玩斗地主.' % self._name)
    
    
    def main():
        person = Person('王大锤', 22)
        person.play()
        person._gender = '男'
        person.play()
        # AttributeError: 'Perso
    if __name__=='__main__':
        main()
    

    上面的这段代码,在运行的时候会提示没有attribute of the Person,看到下面虽然通过@perproty进行了设置age的访问,但是在刚开始 slots设置了Person对象只能绑定gender跟name,所以说在下面的类中不会对age属性进行处理。所以会找不到

    静态方法的使用

    静态方法主要是针对,在在一个类未完成创建的时候,进行的前提判断函数,比如说在创建三角形
    的类的时候,def一个函数来判断这个是不是三角形,然后完成创建,但是你在运行这个判断是不是三角形的函数的时候还没有完成这个类的创建,所以说这个时候就需要一个静态类来实现对这个前提的处理,这个时候就是静态类发生了作用,例子如下

    from math import sqrt
    
    
    class Triangle(object):
    
        def __init__(self, a, b, c):
            self._a = a
            self._b = b
            self._c = c
    
        @staticmethod
        def is_valid(a, b, c):
            return a + b > c and b + c > a and a + c > b
    
        def perimeter(self):
            return self._a + self._b + self._c
    
        def area(self):
            half = self.perimeter() / 2
            return sqrt(half * (half - self._a) *
                        (half - self._b) * (half - self._c))
    
    
    def main():
        a, b, c = 3, 4, 5
        # 静态方法和类方法都是通过给类发消息来调用的
        if Triangle.is_valid(a, b, c):
            t = Triangle(a, b, c)
            print(t.perimeter())
            # 也可以通过给类发消息来调用对象方法但是要传入接收消息的对象作为参数
            # print(Triangle.perimeter(t))
            print(t.area())
            # print(Triangle.area(t))
        else:
            print('无法构成三角形.')
    
    
    if __name__ == '__main__':
        main()
    

    类之间的关系:

    对于这一个,跟c++里面的很相似,无非就是两种情况,第一种是继承,第二种是多态,这个个没什么新奇的,只不过写法不同,继承类的时候,比如出组成继承车的类,写法如下:

    class car(object):
      def __init__(self,color,drive):
          self.color=color
         self.drive=drive
      def run():
        print('the car is going')
    class taxi(car)
      def __init__(self,color,drive,cost):
          super().__init__(name, age)
          self.cost= cost
    

    多态这里不在进行赘述,主要就是一个抽象类的多次重写的功能,不明白的可以看这里封装、继承与多态,里面叙述的比较详细。
    本文中的内容参考来在Python-100-Days的学习,只是当作笔记来看

    相关文章

      网友评论

        本文标题:关于python中面向对象编程的注意点

        本文链接:https://www.haomeiwen.com/subject/zrbxkctx.html