python面向对象 4.12
一. python面向对象(基础和高级)
(一)python面向对象基础:
1. python中面向对象的思想和其它语言相同,类的定义和实例化也比较类似。
在python中通过一个特殊的__init__方法实现实例的初始化:
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()方法。
type()用于判断类型,如int,string
isinstance()用于判断类的实例是否属于某个类;还可以判断一个对象是否是某些类型中的一种,比如下面的代码就可以判断是 否是list或者tuple:
如果要获得一个对象的所有属性和方法,可以使用dir()函数,返回一个包含字符串的 list。
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.成为容器对象的元素
2. slots
(1)Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性。
3. 使用@property
(1)Python内置的 @property装饰器 就是负责把一个方法变成属性调用的:
调用:
运行结果:
4. 多重继承:Python允许从多个父类继承。
如果一个类要实现多个功能,可以使用多重继承来实现,多重继承是对一个类的扩展。
5. 基础的重载方法
重要的函数:
6. 使用元类:元类就是类的类,跟类的模板类似。
元类:metaclass
MyObject = MyClass() #MyObject为类对象
内建函数type能动态的创建类;type可以接受一个类的描述作为参数,然后返回一个类:
type(类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))
使用@property
Pyth对象销毁
二. python中的I/O操作