类和继承
私有成员
Python中若想创建私有变量可以通过在变量名前添加双下划线完成
但是这种方式是伪私有,用户仍可通过 _ClassName__AttrName 的方式来访问
>> > calss A:
__X = 10
>> > obj = A( )
>> > obj. __X
AttributeError: 'A' object has no attribute '__X'
>> > obj. _A__X
10
new
__new__(*args, **kwargs)
创建并返回一个新的对象
__new__()方法将会在__init__()方法之前被调用
当我们的类继承一个不可变对象的类,而我们又需要修改对象时,可以重写该方法
>> > class CapStr ( str ) :
def __new__ ( cls, string) :
string = string. upper( )
return str . __new__( cls, string)
>> > obj = CapStr( 'i am tom' )
>> > obj
I AM TOM
init
__init__()函数类似于C++中的构造函数,在初始化一个对象时将会自动调用
当在__init__()内部定义属性时,属性被认为是实例对象专有的属性,类对象中没有该属性
当在__init__()外部定义属性时,属性被认为是类对象和所有实例对象共有的属性,只有一份
当在函数中通过self.name = value设置属性时,属性被认为是调用该函数的实例对象专有的属性
""" file """
class A :
def __init__ ( self, name) :
self. name = name
print ( '我被调用了,我是A' )
def sayHello ( self) :
print ( 'Hello, i am %s!' % self. name)
class B ( A) :
def __init__ ( self, name, age) :
super ( ) . __init__( name)
self. age = age
print ( '我被调用了,我是B' )
def sayHello ( self) :
super ( ) . sayHello( )
print ( 'I am %d years old!' % self. age)
""" shell """
>> > obj = B( 'Tom' , 15 )
我被调用了,我是A
我被调用了,我是B
>> > obj. sayHello( )
Hello, i am Tom!
I am 15 years old!
del
当对象被销毁时,Python将自动调用__del__()方法
注意:当对一个对象的所有引用都被删除后,__del__()方法才会被调用
>> > class A :
def __init__ ( self) :
print ( '__init__被调用了' )
def __del__ ( self) :
print ( '__del__被调用了' )
>> > obj = A( )
__init__被调用了
>> > obj_2 = obj
>> > del obj
>> > del obj_2
__del__被调用了
类相关的几个内置函数
issubclass、isinstance
issubclass(cls, class_or_tuple, /)
判断一个类是否是一个类的子类或是同一个类或是一些类其中之一的子类
isinstance(obj, class_or_tuple, /)
判断一个对象是否是一个类的实例对象或是一些类其中之一的实例对象
hasattr、getattr、setattr、delattr
注意:下列传入的属性名需要是字符串形式
hasattr(obj, name, /)
判断一个对象是否拥有指定的属性
getattr(object, name[, default])
获取对象的指定的属性的值
若该属性不存在,则当设置default时返回default值
没有设置default时抛出AttributeError异常
setattr(obj, name, value, /)
设置对象的指定属性的值,若该属性不存在,则新建该属性并赋值
delattr(obj, name, /)
删除对象的指定属性,若该属性不存在,则抛出AttributeError异常
property
property(fget=None, fset=None, fdel=None, doc=None)
使用property来完成get、set、del的功能
可以使得这几个函数的改变不影响接口的使用
""" file """
class A :
def __init__ ( self, size) :
self. size = size
def getSize ( self) :
return self. size
def setSize ( self, size) :
self. size = size
def delSize ( self) :
del self. size
x = property ( getSize, setSize, delSize)
""" shell """
>> > obj = A( 10 )
>> > obj. x
10
>> > obj. x = 15
>> > obj. getSize( )
15
>> > obj. setSize( 18 )
>> > obj. getSize( )
18
>> > del obj. x
>> > obj. x
AttributeError: 'A' object has no attribute 'size'