Python学习之路14——类和继承

类和继承

私有成员

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           # 使用property达到get的功能
10
>>> obj.x = 15      # 使用property达到set的功能
>>> obj.getSize()
15
>>> obj.setSize(18)
>>> obj.getSize()
18
>>> del obj.x       # 使用property达到del的功能
>>> obj.x
AttributeError: 'A' object has no attribute 'size'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值