• 13、Python之面向对象进阶篇


    1、静态方法

        静态方法是指可以被类直接调用的方法,其类似于静态属性,其既可以被类直接调用,也可以被对象调用。在python中使用装饰器@staticmethod来申明某个方法为静态方法,静态方法的实例代码如下:

    1 class Grade(object):
    2     def __init__(self,name,count):
    3         self.__name = name
    4         self.__count = count
    5     @staticmethod #申明为静态方法
    6     def print_grade( ):
    7         print("这个类主要是用于创建班级对象")
    8 grade = Grade("高一(2)",20) 
    grade.print_grade()#通过对象直接调用 9 Grade.print_grade()#可以通过类名直接调用

    2、类方法

        类方法也能被类和对象调用,但其只能访问类属性,不能访问对象属性,在python中使用装饰器@classmethod来申明某个方法为类方法,类方法的实例代码如下:

     1 class Grade(object):
     2     __grade_count = 1
     3     def __init__(self,name,count):
     4         self.__name = name
     5         self.__count = count
     6     @classmethod  #申明为类方法 只能访问类属性
     7     def grade_count(self):
     8         print(self.__grade_count)
     9 
    10 Grade.grade_count()#通过类调用
    11 grade = Grade("高一(2)",20)
    12 grade.grade_count() #通过对象调用

    咋一看类方法和静态方法貌似差不错,其实在java或者C++等高级语言中,只有静态方法,没有类方法。python中新增了类方法想必有其原因,具体原因我还不知道,但是!!!我们仔细观察会发现这两种方法还是有一些区别的:

    对于静态方法,系统将不会自动关联self参数,而类方法还是关联的。至于其它的区别,我暂未想到。

    3、静态属性

         python中可以将一个方法变成一个属性,有些时候,我们通常会将一个属性定义为私有属性,而后提供get和set方法用于对私有属性的访问和赋值操作,这样做固然没有问题,但使用起来不如对公有属性那样方便和直观。为了让我们对私有属性的访问如共有属性一样畅通,可使用装饰器@property家族来完成。

        现有这样一个需求,现在有一个学生类,其年龄为私有属性,且年龄字段必须满足以下几个条件:1、用户进行修改时,必须>0,否则修改为0,2、如果年龄为0时,返回100,3,如果年龄字段>0,不可删除,代码实现如下:

     1 class Student(object):
     2     def __init__(self,name,age):
     3         self.__name = name
     4         self.__age = age
     5 
     6     @property
     7     def age(self):
     8         pass
     9     @age.setter
    10     def age(self,value):  #修改
    11         if value > 0:
    12             self.__age = value
    13         else:
    14             self.__age = 0
    15     def print_selft(self):
    16         print("姓名:%s,年龄:%s" % (self.__name,self.__age))
    17     @age.getter        #访问
    18     def age(self):
    19         if self.__age <= 0:
    20             return 100
    21         else:
    22             return self.__age
    23     @age.deleter #删除
    24     def age(self):
    25         if self.__age > 0:
    26             pass
    27         else:
    28             del self.__age
    29 stu = Student("高文祥",18)
    30 stu.age = 1
    31 stu.print_selft()
    32 print(stu.age)
    33 del stu.age
    34 print(stu.age)

    装饰器的property的功能主要有以下2点:1、将一个方法变成一个属性 2,通过property.setter、property.getter以及property.deleter对私有属性进行包装。

    4、特殊成员变量

        1.__str__:对象访问时,系统自动调用的方法,我们可以去重写__str__方法。代码如下:

    1 class Student(object):
    2     def __init__(self,name,age):
    3         self.__name = name
    4         self.__age = age
    5     def __str__(self): #重写基类方法
    6         return self.__name
    7 stu = Student("高文祥",20)
    8 print(stu) #执行结果:高文祥

    2、__setitem__,__getitem__和__delitem__:这组方法能将对对象的操作像对字典一样操作。代码如下:

     1 class Student(object):
     2     def __init__(self):
     3         self.__info = {}
     4     def __setitem__(self, key, value): #设置
     5         self.__info[key] = value
     6     def __getitem__(self, key): #赋值
     7         return self.__info[key]
     8     def __delitem__(self, key): #删除
     9         del self.__info[key]
    10 stu = Student()
    11 stu["name"] = "高文祥"
    12 print(stu["name"])
    13 del stu["name"]
    14 print(stu["name"])

    3、__new__方法:__new__方法是在初始化之前调用的,且是在__init__方法之前调用的,而后在__new__方法中再去调用__init__方法,代码如下:

     1 class Student(object):
     2     def __init__(self):
     3         print("__init__")
     4     def __new__(cls, *args, **kwargs):
     5         print("__new__")
     6         return cls.__init__(cls)
     7 stu = Student()
     8 #执行结果
     9 # __new__
    10 #__init__

    4、其他待补充

    1 class Student(object):
    2     "这是一个学生类"
    3     def __init__(self,name,age):
    4         self.name = name
    5         self.age = age
    6 stu = Student("高文祥",20)
    7 print(stu.__doc__,stu.__dict__)  #执行结果:这是一个学生类 {'name': '高文祥', 'age': 20}
  • 相关阅读:
    马肯9450命令回传
    上海公积金社保业务办理
    工厂调试命令总结
    数据库自动备份
    powerDesigner16.5导出word
    winform 打印预览
    winform 页面设计(一)
    梅特勒-托利多 TCS-35 电子台秤
    winform 练习多线程
    ASP.NET Core 3.1使用Swagger API接口文档
  • 原文地址:https://www.cnblogs.com/win0211/p/8488292.html
Copyright © 2020-2023  润新知