Python面向对象之进阶

一、property 内置函数

装饰器的使用:所有的装饰器函数、方法、类的上一行直接@装饰器的名字

装饰器的分类:

① 装饰函数

② 装饰方法

③ 装饰类

 

property 是一个装饰器函数

@property 是装饰方法的,将一个方法伪装成一个属性,相当于调用方法是不需要加括号

class A:
    def __init__(self,name):
        self.__name = name

    @property
    def name(self):
        return self.__name

a = A('小明')
print(a.name)

'''
小明
'''

 

方法不能被删除,属性可以删除

property的作用:

  一个方法被伪装成属性之后,应该可以执行一个属性的增删改查操作,所有的操作方法必须更property修饰的同名

  增加和修改属性:使用setter装饰的方法,这个方法需要一个必传入的参数,用于私有变量的赋值

  删除属性:使用delete装饰的方法,这个方法并不是在执行是删除属性,而是del 属性的时候执行方法里的代码

class School:
    def __init__(self,name):
        self.__name = name          # 定义私有属性

    @property                       # 把方法装饰为属性
    def name(self):
        return self.__name

    @name.setter                    # 设置属性修改的方法,修改属性的值
    def name(self,new_name):
        self.__name = new_name

    @name.deleter                   # 设置删除属性执行的方法
    def name(self):
        print('不能删除啊!')

harvard = School('哈佛')
print(harvard.name)                 # 获取属性的值
print(harvard.__dict__)             # 获取对象的所有方法和属性
harvard.name = '北大'               # 修改属性的值
print(harvard.__dict__)
del harvard.name                    # 执行被deleter的方法
print(harvard.__dict__)

'''
哈佛
{'_School__name': '哈佛'}
{'_School__name': '北大'}
不能删除啊!
{'_School__name': '北大'}
'''

 

二、@classmethod

classmethod 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等

类方法的特点:

  使用类中的资源,而且这个资源可以直接用类名引用的使用,那这个方法就应该被改为一个类方法。

  类方法使用@classmethod 来修饰,类方法不涉及类对象的资源。

class England:
    __city = 'London'
    def __init__(self):
        pass

    @classmethod                        # 使用类修改本类的静态属性
    def change_capital(cls,city):       # cls是类,类方法
        England.__city = city

print(England._England__city)
England.change_capital('Liverpool')
print(England._England__city)

'''
London
Liverpool
'''

 

三、@staticmethod

staticmethod 返回函数的静态方法。

当一个在类中的普通方法不需要传入类和类对象,可以使用staticmethod修饰

class A:
    @staticmethod
    def func():
        print('静态方法')

A.func()

 

四、类的补充

类包含的内容:

① 静态属性  

调用者:类

特点:所有的对象都统一拥有的属性

 

② 类方法

调用者:类

特点:方法涉及到操作静态属性、类方法、静态方法

形参:cls 表示类

 

③ 静态方法

调用者:类

特点:普通方法,不使用类中的命名空间也不适用对象的命名空间,相当于一个普通的函数,没有默认参数

 

④ 方法

调用者:对象

形参:self 表示对象

 

⑤ property方法

调用者:对象

形参:self 表示对象

 

五、isinstance

检测对象与类的关系

isinstance() 与 tpye() 的区别:

type不接收继承关系,isinstance接收继承关系

type只能判断这个对象是哪个类创建出来的,isinstance能判断对象与类之间的继承关系

type相对精确,isinstance覆盖面广

class A:pass
class B(A):pass

a = A()
b = B()

print(type(b) is B)
print(type(b) is A)
print('---------------')
print(isinstance(b,B))
print(isinstance(b,A))

'''
True
False
---------------
True
True
'''

 

六、issubclass

检测类与类之间的关系,判断cls是否为cls的父类

使用:issubclass(子类,父类 )

class A:pass
class B(A):pass

print(issubclass(A,B))          
print(issubclass(B,A))              # 子类放在第一个参数

'''
False
True
'''

 

posted @ 2018-08-30 18:03  st--st  阅读(181)  评论(0编辑  收藏  举报