zoukankan      html  css  js  c++  java
  • python的类和对象

    1、类的继承(直接在类名后面括号里面写入要继承的类名

      

      

    注:如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性。

      

    解决上述问题的方法:

      a、调用未绑定的父类方法

        

      b、使用super函数(优点是不用给出任何基类的名字,python会自动一层层找到基类中对应的方法)

      多重继承(容易代码混乱,应尽量避免使用

        

      

      出现上述情况的时候,使用继承和多重继承都不合适,于是使用组合:

        

      类、类对象和实例对象

        

      类中的方法名与属性名重名时,类将被属性覆盖:

        

      绑定:python严格要求方法需要有实例才能被调用,这种限制其实就是python所谓的绑定概念。

      1、issubclass(class, classinfo)

        a、一个类被认为是其自身的子类

        b、classinfo可以是类对象组成的元组,只要class与其中任何一个候选子   类,则返回True

      2、isinstance(object,classinfo)

        a、如果第一个参数不是对象,则永远返回False

        b、如果第二个参数不是类或者由类对象组成的元组,会抛出一个TypeError  异常。

      3、hasattr(object,name):测试一个对象是否有指定的属性

      4、getattr(object, name[, default]):返回对象指定的属性值

      5、setattr(object,name,value):设置指定属性的值

      6、delattr(object,name):删除对象中指定的属性,如果属性不存在抛出  异常。

    2、多态(不同的对象对同一类方法的不同响应

    3、self(对象的方法中会传递一个self参数

      由一个类可以生成多个对象,对象之间都极为相似,来源于同一个类,不同的对象调用方法时传递self参数告诉python当前是哪个对象调用方法了。

      

    4、python的魔法方法(总是被双下划线包围)

      1、__init__(self, param1, param2, ...):类似于java中的构造方法

      ps:init方法不能有返回值

      2、__new__(cls[,...]):对象实例化时调用的方法,返回一个类对象

        

      3、__del__(self):当对象被销毁的时候(垃圾回收机制)自动调用

    5、python定义私有属性或方法

      在python中定义私有的变量只需要在变量名或函数名前面加上"__"两个下划线,那么这个函数或变量就会变成私有的了。

      

    ps:python将双下划线开头的名字进行了改编,改成"_类名_属性名/方法名"

      

    6、property方法

      

    7、描述符(property的原理)

      描述符:就是将某种特殊类型的类的实例指派给另一个类的属性。

      特殊类是指至少实现以下三个方法中的一个方法的类:

        a、__get__(self, instance, owner):用于访问属性,它返回属性的值

        b、__set__(self, instance, value):将在属性分配操作中调用,不返回任何内容

        c、__delete__(self, instance):控制删除操作,不返回任何内容

        

      自己实现一个property类,完成描述符的功能:

    #特殊的类要实现__get__、__set__、__delete__三个方法
    class MyProperty:
      def __init__(self, fget=None, fset=None, fdel=None):
        self.fget = fget
        self.fset = fset
        self.fdel = fdel
      def __get__(self, instance, owner):
        return self.fget(instance)
      def __set__(self, instance, value):
        self.fset(instance, value)
      def __delete__(self, instance):
        self.fdel(instance)

    class C:
      def __init__(self):
        self._x = None
      def getX(self):
        return self._x
      def setX(self, value):
        self._x = value
      def delX(self):
        del self._x
    x = MyProperty(getX, setX, delX)
    c = C()
    c.x = 10
    print(c.x)
    print(c._x)

      应用举例:

        

    #定义摄氏度类
    class Cal:
    def __init__(self, value=26.0):
    self.temp = float(value)
    def __get__(self, instance, owner):
    return self.temp
    def __set__(self, instance, value):
    self.temp = float(value)
    def __delete__(self, instance):
    del self.temp
    #定义华氏度类
    class Has:
    def __get__(self, instance, owner):
    return instance.cal * 1.8 + 32
    def __set__(self, instance, value):
    instance.cal = (float(value)-32)/1.8
    #定义温度类
    class Temp:
    cal = Cal() #实例化摄氏度类
    has = Has() #实例化华氏度类

    temp1 = Temp()
    print(temp1.cal)
    print(temp1.has)
    temp1.has = 100
    print(temp1.cal)

    8、对象的属性访问

      a、__getattr__(self, name):定义当一个用户试图获取一个不存在的属性时的行为

      b、__getattribute__(self, name):定义当该类的属性被访问时的行为

      c、__setattr__(self, name, value):定义当一个属性被设置时的行为

      d、__delattr__(self, name):定义当一个属性被删除时的行为

      

    9、注意魔法方法的死循环

      

      属性赋值时,默认自动调用__setattr__方法

      

      解决方法:

        a、调用基类的setattr方法(优选)

          

          class Rectangle:
            def __init__(self, width=0, height=0):
              self.width = width #矩形的长
              self.height = height #矩形的宽
            def __setattr__(self, name, value):
              if name == "square":
                self.width = value
                self.height = value
              else:
                super().__setattr__(name, value)
            def getArea(self): #获得矩形的面积
              return self.width * self.height
          r = Rectangle(4, 5)
          print(r.getArea())
          r.square = 10
          print(r.width)
          print(r.height)
          print(r.getArea())

        b、使用对象的特殊属性dict进行赋值

          

  • 相关阅读:
    MySQL的事务和视图
    MySQL中的常用函数
    高级查询(一)
    街道管理系统
    深入.NET平台和C#编程的错题
    appium python下的API方法
    Charles 使用教程
    appium,iOS下,ios_predicate等定位方式
    Linux -常用命令
    python-列表以及相关函数认识
  • 原文地址:https://www.cnblogs.com/studyDetail/p/6446180.html
Copyright © 2011-2022 走看看