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

导入全部属性

  包

  包将所哟联系的模块组织在一起,有效避免模块名的冲突问题,让应用组织结构更加的清晰。

posted @ 2018-10-17 18:57  stone1234567890  阅读(214)  评论(0编辑  收藏  举报