前言

类中不仅可以有 methods,还可以有变量,这些变量称为类属性,例如如下代码中 Book 类的 TYPES 即为类属性。

类中的方法分为3类:

1. 实例方法 instance method

不使用装饰器
类中的所有方法,如果第一个参数是 self,就是 instance method, self 是创建的类实例,实例方法与实例即对象相关。
(self 可以改成别的名称,但使用 self 是convention,self 是类实例, ),

2. 类方法 class method

使用 @classmethod 装饰
类方法的第一个参数总是 cls。如果方法需要类的信息,用 @classmethod 对其进行装饰, 类方法经常被用作 factory,例如如下代码中的 hardcover 和 paperback 两个 class method 方法就是可用于创建对象的 factory。
(cls 可以改成别的名称,但使用 cls 是convention)

3. 静态方法 static method

使用 @staticmethod 装饰

静态方法并不是真正意义上的类方法,它只是一个被放到类里的函数而已。
尽管如此,仍然称之为方法,但它没有关于 class 或 object 的任何信息,所以它实际上是一个独立的函数,只是被放到了类里,静态方法既没有 self 也没有 cls 参数 。(静态方法可以访问类属性,例如 Book.TYPES)

静态方法通常用于组织代码,例如如果认为将某个函数放到某个类里,整体代码会因此更符合逻辑,于是可以将这个函数变成该类的静态方法。所以如果需要在类里放一个函数进去,此函数不会用到任何关于类或实例的信息,那么就可以用 @staticmethod 对其进行装饰。

三种方法中,实例方法和类方法用得最多,静态方法不常用。

class Book:
    TYPES = ("hardcover", "paperback")  # 精装,平装
    def __init__(self, name, book_type, weight):
        self.name = name
        self.book_type = book_type
        self.weight = weight
    def __repr__(self):
        return f"<Book {self.name}, {self.book_type}, weighing {self.weight}g>"
    def instance_method(self):
        print(f"Called instance method of {self}")
    @classmethod
    def class_method(cls):
        print(f"called class method of {cls}")
    @classmethod
    def hardcover(cls, name, paper_weight):  # cls 名称任意,使用 cls 是 convention
        # 下一行的cls,改成 Book,代码也能跑,但应该写成 cls, 以避免在 inheritance 可能会遇到的问题
        return cls(name, cls.TYPES[0], paper_weight   100)  # 
    @classmethod
    def paperback(cls, name, paper_weight):
        # 下一行的cls,改成 Book,代码也能跑,但应该写成 cls, 以避免在 inheritance 可能会遇到的问题
        return cls(name, cls.TYPES[1], paper_weight)
    @staticmethod
    def static_method():
        print("Called static method")
book = Book("Dive into Python", Book.TYPES[1], 800)
# Called instance method of <Book Dive into Python, paperback, weighing 800g>
book.instance_method()  
# 下一行代码和上一行完全等价
# Called instance method of <Book Dive into Python, paperback, weighing 800g>
Book.instance_method(book) 
# called class method of <class '__main__.Book'>
Book.class_method()
# Called static method
Book.static_method()
h_book = Book.hardcover("Harry Potter", 1500)
light = Book.paperback("Python 101", 600)
# <Book Harry Potter, hardcover, weighing 1600g>
print(h_book)
# <Book Python 101, paperback, weighing 600g>
print(light)

到此这篇关于Python 类方法和静态方法之间的区别的文章就介绍到这了,更多相关Python类方法内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Python 类方法和静态方法之间的区别的更多相关文章

  1. XCode 3.2 Ruby和Python模板

    在xcode3.2下,我的ObjectiveCPython/Ruby项目仍然可以打开更新和编译,但是你无法创建新项目.鉴于xcode3.2中缺少ruby和python的所有痕迹(即创建项目并添加新的ruby/python文件),是否有一种简单的方法可以再次安装模板?我发现了一些关于将它们复制到某个文件夹的信息,但我似乎无法让它工作,我怀疑文件夹的位置已经改变为3.2.解决方法3.2中的应用程序模板

  2. 在Xcode 4中构建与Objective-c应用程序一起使用的静态C lib

    最好的祝福,吉米解决方法JimmyKoerting在评论中提供了正确的答案:应用程序需要与libstdc.dylib链接以解析标准库符号.感谢JimmyKoerting,但还有一件我想添加的内容是,如果您在iOS6.1中使用xcode最新版本,请添加此libstdc.6.dylib

  3. ios – 如何从故事板中创建的静态UITableView中删除单元格

    解决方法你不能真正处理这个数据源,因为使用静态表,你甚至没有实现数据源方法.高度是走的路.尝试这个:更新看来,在autolayout下,这可能不是最好的解决方案.有一个替代答案here可能有帮助.

  4. ios – 两个类,回调和单元测试

    而且,我不觉得这样的行为会很容易测试?

  5. ios – 在分组的表视图中混合静态和动态部分

    可能需要保持静电细胞的强大性能?在表视图的相同.xib文件中直接设计每个静态单元格,并为它们设置插座是否更好?(虽然这不允许重用我的自定义单元格设计…

  6. ios – OS X:将.dylib转换为.a / .o(动态到静态)?

    假设我已经阅读了thiscaveat,我仍然希望将TBB用作静态链接库.但我真的不想重写TBBmakefile来生成libtbb.a而不是libtbb.dylib.是否有一个简单的命令行方式将libtbb.dylib转换为libtbb.o并使用相同的入口点?

  7. xcode – Swift Constants文件 – 类还是结构?

    我想在我的Swift项目中创建一个Constants文件–填充静态let字符串.我应该创建一个结构还是一个类?

  8. ios – 如何将静态单元格拖入tableView swift?

    我在storyBoard中有一个tableView,我在其中添加了4个静态单元格,我的storyBoard看起来像:我没有这个tableView的任何dataSource,因为我的单元格是静态的.我使用下面的代码拖动一个单元格,它工作正常,直到我滚动一个表格.拖动后滚动它看起来像:正如你所看到的那样,细胞不再出现了.我想拖放静态单元格,我想保存它的位置,所以当我滚动时我不会再重新排列.Sample

  9. ios – 示例代码中AVFoundation.Framework中的静态void指针

    我正在浏览AVFoundation.Framework的示例代码–>AVSimpleEditoriOS&我发现以下一行我无法理解.考虑以下在上面的两行中,我可以看出那些是2个静态的void/generic指针,带有一些奇特的名字.现在回到这两行,我再次粘贴在这里,上面的意思是,2个静态void/generic指针存储它自己的&为什么它需要在什么意义上?我只需要很少的指导来学习这种编码模式.等待知识

  10. ios – Static Cells在Interface Builder中显示为空(运行XCode 7.1)

    解决方法终于找到了一个解决方法,因为这仍然发生在Xcode7.2Beta中:在InterfaceBuilder中,选择ViewController并在属性检查器中将其模拟大小设置为“Freeform”,然后切换到大小检查器并设置适合整个内容的高度.说实话,这比滚动更好.猜猜这将成为我在IB中静态表视图的默认设置.版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部