Python学习(二)

学习网址:廖雪峰的Python教程

模块

模块最大的好处就是提高了代码的可维护性,避免函数名和包名的冲突,

使用和安装第三方模块

先import导入,第三方模块,就能用到数据此模块当中的函数和属性

下载地址

面向对象编程

Object Oriented Programming 简称OOP,是一种程序设计思想,OOP把对象作为程序的基本单元,一个对象包含函数和操作函数的方法;

类和实例

面向对象最重要的概念类(class)和实例(instance)

1
2
3
4
class Student(object):
def init(self, name, score):
self.name = name
self.score = score

init 前后有两个下划线,第一个参数始终是self,

访问限制

Class内部有属性和方法,外部可以直接用实例来操作类的属性和方法,隐藏了内部复杂的逻辑,

如果不想让内部属性被外部访问,可以把属性名称前面加上两个下划线__,这样内部属性就变成了私有变量,外部不可访问;

1
2
3
4
class Student(object):
def init(self, name, score):
self.name = name
self.score = score

如果需要对属性变量进行更改或取值,可以给类添加get和set方法,通过,get_name,set_sorce,进行修改;

1
2
3
4
5
6
7
8
class Student(object):
def get_name(self):
return self.__name
def set_score(self, score):
if 0 <= score <= 100:
self.__score = score
else:
raise ValueError('bad score')

其次, __XXX__ 类似这样前后带有双下划线的变量,不是私有变量,可以随意访问. _XXX 带有一个下划线的变量,视为私有变量,不要轻易访问;

带有双下划线的私有变量一定要从外部访问嘛?

不一定,带有双下划线的私有变量,Python解释器,其实把, __name 变量给成了_Student__name, 所以,还是可以通过,_Student__name 的形式进行访问;

但是,强烈建议不要这么做.因为不同版本的Python解释器可能会把 __name 改成不同的变量;

继承和多态

继承最大的好处就是,子类可以拥有父类的全部方法和功能

1
2
3
class Animal(object):
def run(self):
print('Animal is running...')
1
2
3
class Dog(Animal):
def run(self):
print('Dog is running...')
1
2
3
class Cat(Animal):
def run(self):
print('Cat is running...')

Animal就是Dog,Cat的父类,Dog,Cat就是Animal的子类,并拥有父类的全部方法

子类和父类中拥有相同run()方法,说明子类run()方法覆盖了父类run()的方法,代码运行时候就会调用

子类的run()方法,这就是继承的另一个好处:多态

当然也可以添加父类没有的方法

判断一个变量是否是某个类型可以用isinstance()判断:

1
2
>>> isinstance(c, Animal)
True

继承关系树:

img

静态语言 vs 动态语言

对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者

它的子类,否则,将无法调用run()方法。

对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一

个run()方法就可以了:

获取对象信息

想要知道该对象是什么类型的

type()方法
1
2
3
4
5
6
>>> type(123)
<class 'int'>
>>> type('str')
<class 'str'>
>>> type(None)
<type(None) 'NoneType'>

type返回的是对应的Class类型.

比较两个变量的type类型是否相同:

instance()方法

先创建变量类型:

1
2
3
>>> a = Animal()
>>> d = Dog()
>>> h = Husky()

判断:

1
2
3
4
>>> isinstance(h, Husky)
True
>>> isinstance(d, Dog) and isinstance(d, Animal)
True
dir()方法

想要或去一个对象的所有属性和方法,可以使用dir()方法,返回的是一个包含字符串的list,如:

1
>>> dir('ABC')
1
['add', 'class', 'contains', 'delattr', 'dir', 'doc', 'eq', 'format', 'ge', 'getattribute', 'getitem', 'getnewargs', 'gt', 'hash', 'init', 'iter', 'le', 'len', 'lt', 'mod', 'mul', 'ne', 'new', 'reduce', 'reduce_ex', 'repr', 'rmod', 'rmul', 'setattr', 'sizeof', 'str', 'subclasshook', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

还可以配合,getattr(),setattr()和hasattr()方法来操作属性和方法,如:

1
2
3
4
5
6
>>> class MyObject(object):
... def init(self):
... self.x = 9
... def power(self):
... return self.x * self.x...
>>> obj = MyObject()

然后,测试是否含有属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> hasattr(obj, 'x') # 有属性'x'吗?
True
>>> obj.x
9
>>> hasattr(obj, 'y') # 有属性'y'吗?
False
>>> setattr(obj, 'y', 19) # 设置一个属性'y'
>>> hasattr(obj, 'y') # 有属性'y'吗?
True
>>> getattr(obj, 'y') # 获取属性'y'
19
>>> obj.y # 获取属性'y'
19

如果试图获取不存在的属性,会报错:AttributeError的错误

实例属性和类属性

在编写实例属性和类属性的话,尽量不要使用相同的名字,相同名称的实例属性会覆盖掉类属性,如果

删除掉实例属性的话,再用相同名称,访问到的是类属性.


真诚地希望能帮到你!