zoukankan      html  css  js  c++  java
  • Python 面向对象【1】

    对象 = 属性 + 方法
     
    面向对象特征:
    分装 继承 多态【不同对象对同一方法响应不同行动】
     
    类定义
    class xxx:
      ....
      ....
     
    类对象

    类对象支持两种操作:属性引用和实例化

    属性引用 使用和 Python 中所有的属性引用一样的标准语法:类对象名.属性名

    类对象创建后,类命名空间中所有的命名都是有效属性名。所以如果类定义是这样:

    class MyClass
      i = 12345
      def f(self):   
        return 'hello world'
     # 实例化类
    x = MyClass()
    # 访问类的属性和方法
    print("MyClass 类的属性 i 为:", x.i)
    print("MyClass 类的方法 f 输出为:", x.f())

    以上创建了一个新的类实例并将该对象赋给局部变量 x,x 为空的对象

    执行以上程序输出结果为:

      MyClass 类的属性 i 为: 12345

      MyClass 类的方法 f 输出为: hello world

    类有一个名为 __init__() 的特殊方法(构造方法),该方法在类实例化时会自动调用,像下面这样:

    def __init__(self):
      self.data = []

    类定义了 __init__() 方法,类的实例化操作会自动调用 __init__() 方法。如下实例化类 MyClass,对应的 __init__() 方法就会被调用:

    x = MyClass()

    当然, __init__() 方法可以有参数,参数通过 __init__() 传递到类的实例化操作上。例如:

    class Complex:
       def __init__(self, realpart, imagpart):
         self.r = realpart
        self.i = imagpart
    x = Complex(3.0, -4.5)
    print(x.r, x.i)                    # 输出结果:3.0 -4.5

    self代表类的实例,而非类

    类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self

    class Test:
      def prt(self):
        print(self)
        print(self.__class__)
    t = Test()
    t.prt()

    以上实例执行结果为:

    <__main__.Test instance at 0x100771878>
    __main__.Test

    从执行结果可以很明显的看出,self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类

    self 不是 python 关键字,我们把他换成xxx 也是可以正常执行的:

    class Test:
      def prt(xxx):
        print(xxx)
         print(xxx.__class__)
    t = Test()
    t.prt()

    以上实例执行结果为:

    <__main__.Test instance at 0x100771878>
    __main__.Test
    类的方法

    在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self, 且为第一个参数,self 代表的是类的实例 


    class people:
        #定义基本属性
        name = ''
        age = 0
        #定义私有属性,私有属性在类外部无法直接进行访问
        __weight = 0
        #定义构造方法
        def __init__(self,n,a,w):
            self.name = n
            self.age = a
            self.__weight = w
        def speak(self):
            print("%s 说: 我 %d 岁。" %(self.name,self.age))

    # 实例化类
    p = people('jike',10,30)     【类的实例化操作会自动调用 __init__() 方法
    p.speak()

    执行以上程序输出结果为:

    jike 说:  10 岁。
     
    继承
    class xxx(父类名):
      ....
      ....
     
     

    需要注意圆括号中父类的顺序若是基类中有相同的方法名,而在子类使用时未指定,python从左至右搜索

    即方法在子类中未找到时,从左到右查找基类中是否包含方法。

    父类必须与派生类定义在一个作用域内。类定义在另一个模块中时还可以用表达式

    class 派生类名(模块名.父类名):

     举例

    执行以上程序输出结果为:

    ken 说:  10 岁了,我在读 3 年级



    多继承

    class 派生类名(Base1, Base2, Base3):
      ....
      ...  
     

    需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索

    即方法在子类中未找到时,从左到右查找父类中是否包含方法。

    输出:

    我叫 Tim,我是一个演说家,我演讲的主题是 Python

    方法重写

     
     
     
     
    类属性与方法

    类的私有属性【不能在外部调用】

    __private_attrs两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs

    类的方法

    在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。

    self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定是用 self。

    类的私有方法【不能在外部调用】

    __private_method两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods

     

    类的专有方法:

    • __init__ : 构造函数,在生成对象时调用
    • __del__ : 析构函数,释放对象时使用
    • __repr__ : 打印,转换
    • __setitem__ : 按照索引赋值
    • __getitem__: 按照索引获取值
    • __len__: 获得长度
    • __cmp__: 比较运算
    • __call__: 函数调用
    • __add__: 加运算
    • __sub__: 减运算
    • __mul__: 乘运算
    • __truediv__: 除运算
    • __mod__: 求余运算
    • __pow__: 乘方
     
     
     另外
     
    # 针对__str__方法的例子:

    # 各种运算符重载

    反向运算符重载:

    • __radd__: 加运算
    • __rsub__: 减运算
    • __rmul__: 乘运算
    • __rdiv__: 除运算
    • __rmod__: 求余运算
    • __rpow__: 乘方

    复合重载运算符:

    • __iadd__: 加运算
    • __isub__: 减运算
    • __imul__: 乘运算
    • __idiv__: 除运算
    • __imod__: 求余运算
    • __ipow__: 乘方
     举例:

    # 关于 __name__

     

    # 类的静态方法、普通方法、类方法

     
    pass ---占位符,表示稍后输入
     

    如果子类定义与父类同名的方法或属性,会自动覆盖父类的方法或属性
     
     
    子类覆盖父类方法时,若需要父类中该方法中的属性,则要先调用父类该方法,获得所需要的属性,再重写
     
     

    1.调用未绑定的父类方法
    该重写方法第一行: 父类名.xxxx(self ---将子类对象传入)
    2.使用super函数
    super().父类方法名() ---不需要给定任何父类的名字,自动一层层找出
     
     
     
     
    默认要求,类定义中,方法的第一个参数是self == this,表示不同对象调用该方法时,传入一个该对象参数,用以区别谁调用此方法
    构造方法:_init_(self) ---构造方法,实例化对象的时候会自动调用它,默认参数形式如上,此时不需要实例化的时候给与参数,,,,_init_(self,name) ---此时需要给个参数 xx=Yy(zz)
    可以重写此方法自定义初始化操作
     
     
  • 相关阅读:
    ZOJ 2588 Burning Bridges
    POJ 1966 ZOJ 2182 Cable TV Network
    HDU 5348 MZL's endless loop
    HDU 5352 MZL's City
    Tarjan算法求解无向连通图的割点、割边、点双连通分量和边双连通分量的模板
    ZOJ 1119 SPF
    HDU 3452 Bonsai
    HDU 1520 Anniversary party
    POJ 2239 Selecting Courses
    POJ 1144 Network
  • 原文地址:https://www.cnblogs.com/expedition/p/10693091.html
Copyright © 2011-2022 走看看