zoukankan      html  css  js  c++  java
  • python高级教程-面向对象

    创建类:

    class  类名:

        类体(由类成员,方法,数据属性组成)

    例如:

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    class Employee:
       '所有员工的基类'                                                                                                                                                                 类名.类变量
       empCount = 0                               #类变量  ,它的值将在这个类的所有实例之间共享,可以在内部类或外部类使用Employee.empCount 访问
     
       def __init__(self, name, salary):
          self.name = name
          self.salary = salary
          Employee.empCount += 1
       
       def displayCount(self):
         print "Total Employee %d" % Employee.empCount
     
       def displayEmployee(self):
          print "Name : ", self.name,  ", Salary: ", self.salary

    第一种方法__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法

    self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。

    创建实例对象:类的实例化类似函数的调用方式。

                             以下使用类的名称 Employee 来实例化,并通过 __init__ 方法接受参数。

                          

                            "创建 Employee 类的第一个对象"
                             emp1 = Employee("Zara", 2000)
                           "创建 Employee 类的第二个对象"
                             emp2 = Employee("Manni", 5000)

    访问属性:您可以使用点(.)来访问对象的属性。使用如下类的名称访问类变量:

                       emp1.displayEmployee()
                       emp2.displayEmployee()
                       print "Total Employee %d" % Employee.empCount

    例如:

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
     
    class Employee:
       '所有员工的基类'
       empCount = 0
     
       def __init__(self, name, salary):
          self.name = name
          self.salary = salary
          Employee.empCount += 1
       
       def displayCount(self):
         print "Total Employee %d" % Employee.empCount
     
       def displayEmployee(self):
          print "Name : ", self.name,  ", Salary: ", self.salary
     
    "创建 Employee 类的第一个对象"
    emp1 = Employee("Zara", 2000)
    "创建 Employee 类的第二个对象"
    emp2 = Employee("Manni", 5000)
    emp1.displayEmployee()
    emp2.displayEmployee()
    print "Total Employee %d" % Employee.empCount

    添加,修改,删除类属性:

    emp1.age = 7  # 添加一个 'age' 属性
    emp1.age = 8  # 修改 'age' 属性
    del emp1.age  # 删除 'age' 属性

     getattr(obj, name[, default]) : 访问对象的属性。
      hasattr(obj,name) : 检查是否存在一个属性。
      setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性。
      delattr(obj, name) : 删除属性。
    例如:
    hasattr(emp1, 'age')    # 如果存在 'age' 属性返回 True。
    getattr(emp1, 'age')    # 返回 'age' 属性的值
    setattr(emp1, 'age', 8) # 添加属性 'age' 值为 8
    delattr(empl, 'age')    # 删除属性 'age'

    类的继承:实现代码的重用

    继承中的特点:

    1.基类的构造函数(__init()__方法)不会被调用,需要在派生类的构造中亲自专门调用。

    2.在调用基类方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别在于调用普通函数时不需要带上self参数。

    3.先在本类中查找调用的方法,找不到才去基类中找。

    派生类的声明:

    class  派生类名(基类名1,基类名2,基类名3.........):

    例如:

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
     
    class Parent:        # 定义父类
       parentAttr = 100
       def __init__(self):
          print "调用父类构造函数"
     
       def parentMethod(self):
          print '调用父类方法'
     
       def setAttr(self, attr):
          Parent.parentAttr = attr
     
       def getAttr(self):
          print "父类属性 :", Parent.parentAttr
     
    class Child(Parent): # 定义子类
       def __init__(self):
          print "调用子类构造方法"
     
       def childMethod(self):
          print '调用子类方法'
     
    c = Child()          # 实例化子类
    c.childMethod()      # 调用子类的方法
    c.parentMethod()     # 调用父类方法
    c.setAttr(200)       # 再次调用父类的方法 - 设置属性值
    c.getAttr()          # 再次调用父类的方法 - 获取属性值

    也可以继承多个类,即多继承

    class A:        # 定义类 A
    .....

    class B:         # 定义类 B
    .....

    class C(A, B):   # 继承类 A 和 B    只要用逗号隔开

    方法重写:父类的方法不能满足子类的需求。

    例如:

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
     
    class Parent:        # 定义父类
       def myMethod(self):
          print '调用父类方法'
     
    class Child(Parent): # 定义子类
       def myMethod(self):
          print '调用子类方法'
     
    c = Child()          # 子类实例
    c.myMethod()         # 子类调用重写方法

    重载方法:__str__(self)    简单的调用方法  str(obj)

    类的属性和方法:

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

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

    类方法:在类的内部,使用def可以为类定义一个方法,与一般函数的定义不同,类方法必须包含参数self,且为第一个参数。

    例如:

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
     
    class JustCounter:
        __secretCount = 0  # 私有变量
        publicCount = 0    # 公开变量
     
        def count(self):
            self.__secretCount += 1
            self.publicCount += 1
            print self.__secretCount
     
    counter = JustCounter()
    counter.count()
    counter.count()
    print counter.publicCount
    print counter.__secretCount  # 报错,实例不能访问私有变量

    Python不允许实例化的类访问私有数据,但你可以使用 object._className__attrName 访问属性,将如下代码替换以上代码的最后一行代码:

    print counter._JustCounter__secretCount

    单下划线、双下划线、头尾双下划线说明:

    __foo__: 定义的是特列方法,类似 __init__() 之类的。

    _foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *

    __foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。

  • 相关阅读:
    Building a flexiable renderer
    Indirect Illumination in mental ray
    我的心情
    Cellular Automata
    Subsurface Scattering in mental ray
    Shader Types in mental ray
    BSP Traversal
    我的渲染器终于达到了MR的速度
    How to handle displacement and motion blur
    说明
  • 原文地址:https://www.cnblogs.com/linqiuhua/p/7716481.html
Copyright © 2011-2022 走看看