python面向对象
面向过程:函数式编程,C程序。
面向对象:C++,Java,Python等。1
2
3
4str.+TAB键 查看字符串的方法
list. +TAB键 查看列表的方法
tuple. +TAB键 查看元组的方法
dict. +TAB键 查看字典的方法
类和对象
类:对事物的抽象,比如:人类,球类。
对象:类的一个实例,比如:篮球,足球。
实例的说明:
球类可以对球的特征和行为进行抽象,然后可以实例化一个真实的球实体出来。
面向对象的思想:封装、继承、多态。
类的定义
类把需要的变量和函数组合在一起,这种包含称为封装。1
class A(object):
命名:1个单词首字母大写,多个单词首字母都大写。
创建对象的过程称之为实例化;当一个对象被创建之后,包含3方面的特性:对象句柄、属性和方法。
句柄用于区分不同的对象。
对象的属性和方法与类中的成员变量和成员函数对应。1
obj = MyClass() //创建类的一个实例(对象),通过对象调用方法和属性
类的结构
1 | class 类名: |
类的创建
1 | class MyClass(object): |
类的方法至少有一个参数self。
实例
1 | #!/usr/bin/python |
输出结果1
2
3yellow
I am a black
I am a thinker
类的属性
定义
按使用范围:私有属性和公有属性。
公有属性:在类中和类外都能调用的属性。
私有属性:不能再类外及被类以外的函数调用。
定义方式:以””双下划线开始的成员变量就是私有属性,可以通过instance._classname_attribute方式访问(不建议使用,仅用于测试)。
内置属性:由系统在定义类的时候默认添加的,由前后双下划线构成,`dict、
module__`。
支持中文的写法1
2
3#coding:utf8
#encoding:utf8
#coding:utf-8
实例
1 | #!/usr/bin/python |
输出结果1
2
3
4
5
6
7
8
9
10白色人
I am a black
I am a thinker
30
30
{'color': 'black'}
##############################
yellow
##############################
{'__module__': '__main__', 'color': 'yellow', '__doc__': None, '__dict__': <attribute '__dict__' of 'People' objects>, '_People__age': 30, '__weakref__': <attribute '__weakref__' of 'People' objects>, 'think': <function think at 0x7f95deb1bc08>}
类的方法
方法的定义和函数一样,但是需要self作为第一个参数。
分类
公有方法:在类中和类外都可以调用的。
私有方法:不能被类的外部调用,在方法前面加上”__”双下划线。
self参数:用于分区函数和类方法(必须有一个self),self参数表示执行对象本身。
类方法:被classmethod()函数处理过的函数,能被类所调用,也能被对象所调用(是继承的关系)。
静态方法:相当于全局函数,可以被类直接调用,可以被所有实例化对象共享,通过staticmethod()定义,静态方法没有self参数。
实例
- 公有方法调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#!/usr/bin/python
#coding:utf8
class People(object):
color = 'yellow'
__age = 30
def think(self):
print "I am a %s" % self.color
print "I am a thinker"
print self.__age
def test(self):
self.think()
jack = People()
jack.test()
输出结果1
2
3I am a yellow
I am a thinker
30
- 私有方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#!/usr/bin/python
#coding:utf8
class People(object):
color = 'yellow'
__age = 30
def think(self):
print "I am a %s" % self.color
print "I am a thinker"
print self.__age
def __talk(self):
print "I am talking with Tom"
def test(self):
self.__talk()
jack = People()
jack.test()
jack.__talk()
输出结果1
2
3
4
5I am talking with Tom
Traceback (most recent call last):
File "1_9_4.py", line 21, in <module>
jack.__talk()
AttributeError: 'People' object has no attribute '__talk'
- 类方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#!/usr/bin/python
#coding:utf8
class People(object):
color = 'yellow'
__age = 30
def test(self):
print "Testing..."
cm = classmethod(test)
jack = People()
People.cm()
People.test()
输出结果(类方法必须经过classmethod方法处理,否则会报错如下)1
2
3
4
5Testing...
Traceback (most recent call last):
File "1_9_4_1.py", line 15, in <module>
People.test()
TypeError: unbound method test() must be called with People instance as first argument (got nothing instead)
- 静态方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14#!/usr/bin/python
#coding:utf8
class People(object):
color = 'yellow'
__age = 30
def test():
print "this is a func"
sm = staticmethod(test)
jack = People()
People.sm()
输出结果1
this is a func
- 装饰器(仅对相邻的第一个函数起作用,类方法和静态方法的简化)
@classmethod
@statucmethod1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#!/usr/bin/python
#coding:utf8
class People(object):
color = 'yellow'
__age = 30
def test(self):
print "this is a class method"
def test1():
print "this is a static method"
jack = People()
People.test()
People.test1()
输出结果1
2this is a class method
this is a static method
说明
静态方法:将类的所有属性和方法提前加载到内存。
动态方法:只加载调用的属性和方法至内存,未调用的不加载。