python学习笔记(7): 面向对象
class Foo: #类中的函数 def bar(self): #功能阐述 print('Bar') pass def hello(self,name): print('i am %s' %name) #根据Foo创建对象obj obj=Foo() #在创建对象的时候,记得后面加个括号 #注意,按照python的通用规则,Class用驼峰表示(HelloWorld) #而其他的obj等,都用'_'隔开(this_is_obj) #类中函数第一个方法必须是self,指代本类的一个东西,类中定义的函数叫做'方法' obj.bar() obj.hello('july')
#创建类 class Foo: #这里我们可以创建一个类级别的变量 #他不会随着由此类创建的变量而变化 name='Jan' def bar(self): print('Bar') def hello(self,name): print('you are %s' %self.name) print('I am %s' %name) print('\n') #根据Foo创建对象 obj1= Foo() obj2=Foo() obj1.hello('August') obj2.hello('July') #这个self就是一个代指,代指了自己所在的class #也可以使用self点代自己所指的class函数本身 #self本身就是一个代词,并不一定要交self,也可以用其他的词来代替,只不过 #必须是这个类的所有字方法的第一个参数
#创建类 class Foo: #这里可以创建一个类级别的变量 #他不会随着由此类创建的变量而变化 name='Jan' def bar(july): print('Bar') def hello(july,name): #但是只要其作为第一参数的位置没有变,依旧是Foo #Foo Class的自我指代 print('you are %s'%july.name) print('I am %s'%name) print('\n') #根据Foo创建对象 obj1 = Foo() obj2 = Foo() obj1.hello('August') obj2.hello('July')
一、类和实例
1.类(Class):用来具有相同属性和方法的对象的集合。它定义了该集合汇总的每个对象共有的属性和方法,对象是类的实例。
2.类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中,且定义在函数体外。类变量通常不作为实例变量使用。
3.实例变量:定义在方法中的变量,只作用于当前实例的类
4.类和对象的使用:
类就是一个模板,模板里可以包含多个函数,在函数里实现一些功能
对象则是根据模板创建的实例,通过实例对象可以创建类中的函数
5.构造函数:构造函数式一种特殊的方法,主要用来在创建对象初始的时候,就完成一些动作
跟所有的面向对象的语言一样,python也是有构造函数的
#创建类 class Foo: def __init__(self):#这就是构造函数,它的职责就是在模型创建的初期,就完成一些动作 #简单的说,就是自定义一些初始化的步骤 #同样,它也需要self来指代这个class self.name='Jane' def hello(self,name): print('you are %s'%self.name) print('I am %s'%name) print('\n') #当你创建一个Foo类的时候,init会自动跑一圈 obj=Foo() #在我们的例子中,我们会默认给self自己的name变量,赋值为'JAN' #此刻,当我们调用Foo的hello()方法的时候,hello自己的name变量,被赋值为'July' obj.hello('July')
#创建类 class Foo: def __init__(self,name):#可以在这里附加上一些参数 #这些参数将是你创建一个Foo类的时候的必要条件 self.name=name def hello(self,name): print('you are %s'%self.name) print('I am %s'%name) print('\n') #完毕 #当你还在创建一个Foo类的时候,init()就会自动跑一遍 #此刻,你可以直接跑Foo(),需要填入一个参数:name2 obj=Foo('Feb') #然后再调用hello,并复制July obj.hello('July')#这个地方首先打印出:you are Feb;后面打印出'I am july'
#为了防止这种篡改年龄的事情的发生,为了维护世界的和平,需要把关键信息做好隐藏 class Student: def __init__(self,name,age): self.name=name self.age=age def detail(self): print(self.name) print(self.age) Lilei=Student('LiLei',12) Lilei.age=20 Lilei.detail() #LiLei #20
以下这种方式实现了信息隐藏
二、访问限制
三、继承和多态以及多重继承
1.在python中展现面向对象的3大特性:
面向对象的3大特性是:封装、继承和多态
2.封装是指将内容封装到某个地方,用于日后的调用
他需要:
把内容封装在某处
从移除调用被封装的内容
class Student: #假定我们初始化一个Student类的时候做的就是,记录下每个学生的名字和年龄 def __init__(self,name,age): self.name=name self.age=age #至此,我们用self指代student本身,并用name和age存下了他们的年龄和名字 #此时,我们创建一个学生 obj1=Student('July',18) print(obj1.name)#直接调用obj1对象的name属性 print(obj1.age)#直接调用obj1对象的age属性 obj2= Student('Aug',73) print(obj2.name) print(obj2.age)
class D: def bar(self): print('D.bar') class C(D): def bar(self): print('C.bar') class B(D): pass class A(B,C): pass a=A() #在执行bar方法的时候,首先在A类中进行查找,如果A类中没有,则继续去B类中寻找 #如果B中没有,则继续去D中去寻找,如果D类中没有,则继续去C类中进行寻找,如果还是没有找到就会报错 #所以查找顺序为:A-->B--->D-->C #在上述的查找过程中,一旦找到,寻找过程就会立即中断,不会再继续查找了 #python是一种弱类型的语言,只要不报错,什么东西都可以放进来 a.bar()
四、获取对象信息
1.当我们拿到一个对象的引用时候,如何知道这个对象是什么;类型,有哪些方法的呢?
type(123)
int 类型
type('str')
str类型
type(abs)#abs是取绝对值的一个方法
#builtin function or method#内置的方法或者函数
class a:
def __init__(self):
pass
type(a)
如何用语句判断是不是一种type呢?
type(123)=type(456)
#True
type('abc')==type('123')
#True
type('abc')==type(123)
False
用instance()
instance()告诉我们一种对象是不是某一种类型(包括继承关系)
class A:
pass
class B(A):
pass
class C(B)
pass
K=A()
g=B()
y=C()
isinstance(y,C)
class A: pass class B(A): pass class C(B): pass k=A() g=B() y=C() print(isinstance(y,C))#True print(isinstance(y,B))#True print(isinstance(y,A))#True
2.使用dir()
如果要获得一个对象的属性和方法,那就使用dir()函数,返回一个包含字符串的list
比如,获得一个str对象的所有的属性和方法
print(dir('ABC')) #['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__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', 'isascii', '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']
五、实例属性和类属性
由于python是动态语言,根据创建的实例可以任意绑定属性
给实例绑定属性的方法是通过实例变量,或者通过self变量
六、模块和包
python的程序由包(package)、模块(module)和函数组成。包是由一系列模块组成的集合。模块是处理某一类问题的函数和类的集合
包就是一个完成特定任务的工具箱,python提供了很多有用的工具包。如字符串处理,图形用户接口、web应用、图形图像处理等。这些自带的工具包和模块安装在Python的安装目录下的lib子目录中。
注意:至少包含一个__init__.py文件,该文件的内容可以为空。__int__.py用于表示当前文件夹是空的。
模块
在Python中一个文件可以被看成一个独立的模块,而包对应着文件夹,模块把python代码分成一些有组织的代码段,通过导入的方式实现代码的重用。
导入模块的时候,是按照sys.path变量的搜索模块,sys.path的值是包含每一个独立路径的列表,包含当前目录、python目录、python环境变量、搜索顺序按照路径在列表中的顺序
想想看自己的python路径,可以
import sys
print(sys.path)
如果你发现你在某个地方写的文件(包)import错误,你就可以看看这个sys.path是否囊括了你那批文件的根目录
导入模块
使用import语句(不管是别人写的,还是你下载别人的)
import module1
import module2
impotr module3
import module1,module2,module3
一般在文件首部导入所有的模块
python标准库
第三方库
应用程序自定义模块
使用from-import语句导入模块
单行导入
from module import name1,name2,name3
多行导入
from module import name1,name2,name3
导入全部属性
包
包将所哟联系的模块组织在一起,有效避免模块名的冲突问题,让应用组织结构更加的清晰。