python面向对象 4.12

一. python面向对象(基础和高级)

    (一)python面向对象基础:

     1.  python中面向对象的思想和其它语言相同,类的定义和实例化也比较类似。

        python中通过一个特殊的__init__方法实现实例的初始化:

       

      
     
       分析: __ init __ 方法的第一个参数永远都是 self ,表示创建实例本身(传参时系统会自动传入,传入自己写的对应参数即可),          在 __ init __ 方法内部,可以 把各种属性绑定到 self 因为 self 指向创建的实例本身

    2. 类成员的修饰符:公有成员和私有成员。私有成员命名时,前两个字符是下划线,如__name。(特殊成员除外,例        如:__init__、__call__等)

    对于类的静态字段和普通字段,私有属性仅类内部可以使用,如果外部需要调用,加上get和set方法。

    

   Python中如果变量名以双下划线开头和结尾的,是特殊变量__XXX__。特殊变量是可以直接从类内部访问的,如 __init__,__exit__

   3. 面向对象的三大特性:封装、继承、多态

    (1) 封装:数据和逻辑都被封装起来,直接调用方法即可,但却可以不用知道内部的细节,类似于java语言

    (2)继承和多态:                     

          class Animal(object):
                        
def run(self):
                            
print('Animal running...')

          class Dog(Animal):
                       
def run(self): #父类方法重写
                            
print("Dog running...")

          class Cat(Animal):
                      
def run(self): #父类方法重写
                           
print("Cat running...")
          jinmao = Dog()

          jinmao.run()

    分析:python中继承的写法如上,子类和父类中的方法相同,子类中的方法会将父类中的方法覆盖。

    对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法  调用run()方法。

    对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了。
 4. 获取对象信息

   type()用于判断类型,如int,string

   isinstance()用于判断类的实例是否属于某个类;还可以判断一个对象是否是某些类型中的一种,比如下面的代码就可以判断是    否是list或者tuple

   如果要获得一个对象的所有属性和方法,可以使用dir()函数,返回一个包含字符串的 list。

  

    类似 __xxx__ 的属性和方法在 Python 中都是有特殊用途的,比如 __ len __ 方法返回长度。在 Python 中,如果你调用 len () 函数试图    获取一个对象的长度,实际上,在 len () 函数内部,它自动去调用该对象的 __ len __() 方法,所以,下面的代码是等价的:

      

5. python类的内置属性
__doc__ : 类的文档字符串 ,不可被派生
__name__: 类名
__module__: 类定义所在的模块(类的全名是 ‘__ main__. className 如果类位于一个导入模块 mymod ,        那么 className .__module__ 等于 mymod
__bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)。

 

 Student.__doc__:None

 Student.__name__:Student

 Student.__module__:__main__

 Student.__bases__:(<type 'object'>,)

Student.__dict__:{'__module__': '__main__', 'print_info':<function print_info at0x0000000002F48AC8>, '__dict__':<attribute '__dict__'of 'Student' objects>, '__weakref__':<attribute '__weakref__'of 'Student' objects>, '__doc__': None, '__init__': <function __init__ at0x0000000002F48A58>}

(二)python面向对象进阶:

 1. python对象的销毁

   (1) python内部使用引用计数技术来实现跟踪和垃圾的回收,Python内部记录着所有使用中的对象各有多少引用,当对象的引    用数目变为0之后,改对象作为将要回收的对象,python不是立即回收,而是在适当的时机进行回收。

   

    

(2)垃圾回收机制不仅针对引用计数为0的对象,同样也可以处理循环引用的情况。循环引用指的是,两个对象相互引用,但是没有其他变量引用他们。这种情况下,仅使用引用计数是不够的。

Python 的垃圾收集器实际上是一个引用计数器和一个循环垃圾收集器。作为引用计数的补充,垃圾收集器也会留心被分配的总量很大(及未通过引用计数销毁的那些)的对象。 在这种情况下, 解释器会暂停下来, 试图清理所有未引用的循环

对象的引用计数在:1.对象被创建时;2.另外的别名被创建;3.作为参数传递给函数(新的本地引用);4.成为容器对象的元素

减少引用计数:当对象的引用被销毁时,引用计数会减少。最明显的例子就是当引用离开其作用范围时,这种情况最经常出现在函数运行结束时,所有局部变量都被自动销毁,对象的引用计数也就随之减少。
(3) 对象的销毁:析构函数 __del__ __del__ 在对象销毁的时候被调用,当对象不再被使用时, __del__ 方法运行:
   

 2. slots

  (1)Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制class实例能添加的属性。

  

 

 分析: 由于’ score’ 没有被放到 __slots__ 中,所以不能绑定 score 属性,试图绑定 score 得到 AttributeError 的错误。
 使用 __slots__ 要注意, __slots__ 定义的属性仅对当前类实例起作用, 对继承的子类是不起作用的 , 除非在子类中也定  义 __slots__ ,这样,子类实例允许定义的属性就是自身的 __slots__ 加上 父类 __slots__

 3. 使用@property

  (1)Python内置的 @property装饰器 就是负责把一个方法变成属性调用的:

  

  调用:

  

 运行结果:

 

 4. 多重继承:Python允许从多个父类继承

     

 如果一个类要实现多个功能,可以使用多重继承来实现,多重继承是对一个类的扩展。

5. 基础的重载方法

重要的函数:


 

6. 使用元类:元类就是类的类,跟类的模板类似。

   元metaclass

    元类就是用来 创建类 (对象)的,元类就是类的 类:
   MyClass = MetaClass ()   # MyClass 为类对象

   MyObject = MyClass()    #MyObject为类对象

   内建函数type能动态的创建类;type可以接受一个类的描述作为参数,然后返回一个类:

   type(类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))

    控制类的创建行为,还可以使用 metaclass
   


使用@property 

 



 Pyth对象销毁


   


   

       


二. python中的I/O操作


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值