Byte of Python学习笔记五

原创 2011年10月15日 10:43:00
十. 面向对象编程
Python中所有事物皆对象。没有类似Java中的基本数据类型,Python中整型数是int类对象。
类(对象)拥有的变量称为域(fields), 类(对象)拥有的函数称为方法(methods)。域和方法都是类的属性(attributes)。

类通过关键字class定义,类的域和方法在class声明后的块中定义。如:
class Person:
    pass # An empty block
p = Person()
前两行定义类Person,第三行创建Person类对象p。

实例方法(对象方法)
Python中对象方法中拥有一个(必须有一个)特殊参数self(也可以是其他名称),位于对象方法的参数列表中首位,调用时不需要给它赋值,Python会自动将当前对象引用赋给给参数,相当Java中的this。如:
class Person:
    def sayHi(self):
          print('Hello, how are you')
p = Person()
p.sayHi()
上面定义了类Person,它拥有sayHi方法,它拥有一个必需参数self,调用时直接调用sayHi(),无需给self传参。

初始化方法__init__
初始化方法在类对象实例化时调用,方法名固定为__init__。
#!/usr/bin/python
# Filename: class_init.py

class Person:
    def __init__(self, name):
         self.name = name
         print('Person对象初始化')
p = Person('Swaroop')
>python class_init.py
Person对象初始化

类和对象变量
Python有两种变量:类变量和实例变量。类变量属于类,被类的所有对象共享;实例变量属于类对象,每个类对象都有自己的变量,与其他类对象无关。类变量通过类名.变量名来访问,实例变量通过对象.变量名来访问,在类方法中通过self.变量名类访问。如:
#!/usr/bin/python
# Filename: objvar.py
 
class Robot:
    '''Represents a robot, with a name.'''
    # A class variable, counting the number of robots
    population = 0
 
    def __init__(self, name):
        '''Initializes the data.'''
        self.name = name
        print('(Initializing {0})'.format(self.name))
 
        # When this person is created, the robot
        # adds to the population
        Robot.population += 1

    def __del__(self):
        '''I am dying.'''
        print('{0} is being destroyed!'.format(self.name))
 
        Robot.population -= 1
 
        if Robot.population == 0:
            print('{0} was the last one.'.format(self.name))
        else:
            print('There are still {0:d} robots working.'.format(Robot.population))
 
    def sayHi(self):
        '''Greeting by the robot.
 
        Yeah, they can do that.'''
        print('Greetings, my masters call me {0}.'.format(self.name))
    def howMany():
        '''Prints the current population.'''
        print('We have {0:d} robots.'.format(Robot.population))
    howMany = staticmethod(howMany)
 
droid1 = Robot('R2-D2')
droid1.sayHi()
Robot.howMany()
 
droid2 = Robot('C-3PO')
droid2.sayHi()
Robot.howMany()
 
print("\nRobots can do some work here.\n")
print("Robots have finished their work. So let's destroy them.")
del droid1
del droid2
Robot.howMany()
上面程序中population为类变量,name为对象变量,population通过类名来访问Robot.population,对象变量在方法中通过self来访问self.name。

销毁方法__del__
__del__方法为对象销毁方法,在对象彻底不再使用时执行,但执行时间不能确定,除非明确执行对象删除方法(del obj),此时会立即调用__del__方法,如上例所示。

静态方法
上例中howMany方法为静态方法,可以直接通过类名来访问Robot.howMany(),也可以通过类对象来访问。定义时不需要self参数。静态方法的定义,注意这句话howMany = staticmethod(howMany),它将howMany方法转换为静态方法。详细信息查看help(staticmethod)

类方法
类方法与对象方法类似,也有一个必须的参数cls(可以为其他名称),调用时Python自动将类传递给参数cls。类方法也可以直接通过类名来方法。如:
>>>class Person:
          def sayHello(cls):
                print(cls, 'say Hello')
>>>Person.sayHello()
<class '__main__.Person'> say Hello

Python中类私有变量和私有方法以两个下划线(__)开头,其他变量均为公共变量,方法均为虚方法(可以被子类覆盖)。

继承
Python中一个类可以继承多个类,也具有多态性。子类构造函数不会自动调用父类构造函数,如果要调用父类构造函数,必须明确调用。如
#!/usr/bin/python
# Filename: inherit.py

class SchoolMember:
    '''Represents any school member.'''
    def __init__(self, name, age):
        self.name = name
        self.age = age
        print('(Initialized SchoolMember: {0})'.format(self.name))
    
    def tell(self):
        '''Tell my details.'''
        print('Name:"{0}" Age:"{1}"'.format(self.name, self.age), end="
 ")
class Teacher(SchoolMember):
    '''Represents a teacher.'''
    def __init__(self, name, age, salary):
        SchoolMember.__init__(self, name, age)
        self.salary = salary
        print('(Initialized Teacher: {0})'.format(self.name))
    def tell(self):
        SchoolMember.tell(self)
        print('Salary: "{0:d}"'.format(self.salary))
类Teacher继承类SchoolMember,定义时父类写在子类名后括号中,可以有多个父类,多个父类用逗号分隔

SEM实战教程(五)

-
  • 1970年01月01日 08:00

Python学习笔记(五)Demos

生成随机串import string,randomfield = string.letters + string.digits def getRandom(): return "".join(...
  • bless2015
  • bless2015
  • 2017-09-01 21:42:12
  • 388

Python数据分析学习笔记五

NumPy常用函数一文件读写:1、创建单位矩阵,所谓单位矩阵就是主对角线上所有元素都是1,其他地方全是0的二维数组,numpy可以很方便地创建这样的矩阵,即利用eye函数,例: import nump...
  • wujian4018
  • wujian4018
  • 2016-04-27 18:01:54
  • 942

Python学习笔记

  • 2010年02月23日 17:05
  • 596KB
  • 下载

cmake 学习笔记(六)

希望这是现阶段阻碍阅读shiboken和PySide源码的涉及cmake的最后一个障碍 ^ _^ 学习 cmake 的单元测试部分 ctest。 简单使用 最简单的使用ctest的方法,就是...
  • dbzhang800
  • dbzhang800
  • 2011-04-22 15:12:00
  • 7042

A Byte of Python

  • 2010年06月27日 21:57
  • 414KB
  • 下载

多版A Byte of Python中英文翻译整合对比

  • 2018年03月06日 16:14
  • 5.02MB
  • 下载

cmake学习笔记(五)

在cmake 学习笔记(三) 中简单学习了 find_package 的 model 模式,在cmake 学习笔记(四)中了解一个CMakeCache相关的东西。但靠这些知识还是不能看懂PySide使...
  • dbzhang800
  • dbzhang800
  • 2011-04-22 12:05:00
  • 8268

Redis系列学习笔记5 集合

集合存储多个各不相同的元素Redis的集合以无序的方式存储多个各不相同的元素。用户可以快速地向集合添加元素,或者从集合里面删除元素,也可以对多个集合进行集合运算操作,比如计算并集、交集和差集。SADD...
  • ECHO_FOLLOW_HEART
  • ECHO_FOLLOW_HEART
  • 2016-05-23 16:04:19
  • 272

51单片机学习笔记(五)

            已经很多天没有写程序了,原因很简单,竟是迷上了新版的西游记,连续看了几天,今天写的是续上以前的教材,“心率计数器”是继“电子时钟”的一个计算器/计时器的应用。         ...
  • flyleaf91
  • flyleaf91
  • 2010-08-06 17:31:00
  • 674
收藏助手
不良信息举报
您举报文章:Byte of Python学习笔记五
举报原因:
原因补充:

(最多只允许输入30个字)