iOS开发人员如何学习Python编程17-面向对象编程3

159 阅读3分钟

这是我参与11月更文挑战的17天,活动详情查看:2021最后一次更文挑战

方法介绍

类的方法主要可分为:

  • 普通方法(实例方法)
  • 类方法
  • 静态方法

普通方法(实例方法)

普通方法保存在类中,在实例化对象后,一般通过对象调用。第一个参数必须为系统自建参数,默认为self,代指对象本身。

⚠️注意: self仅仅是变量名。使用其它也可,但最好不要修改。

class Demo(object):
    def __init__(self):
        self.name = "肉丝"

    # 普通方法(实例方法)
    def test(self):
        print(self.name)
        
rose = Demo()
rose.test()  # 实例化后 通过 对象 调用

当方法中需要使用普通字段(实例对象)时,通常使用普通方法。

静态方法

静态方法通过在方法上面添加@staticmethod装饰器定义,保存在类中。

静态方法不需要传入self参数,即使传入了self参数也并不像普通方法那样代指对象本身,仅仅是一个普通的形参。

静态方法的调用虽然可以通过对象调用,但一般由类调用。

class Demo:
    def __init__(self):
        self.name = "rose"
        self.age = 18

    def test(self):
        print(self.name)

    @staticmethod          # 通过@staicmethod装饰器将方法转为静态方法
    def stat_test():       # 静态方法 self不是必须加的,加了也不止对象
        print("我是静态方法")

rose = Demo()
rose.test()
Demo.stat_test()   # 一般通过类名调用

静态方法的参数并不代表对象这一特点,使静态方法在类中使用起来更像一个单纯的函数。完全可以将静态方法放在类的外部,当成函数使用。但是放在类中,便于使用与维护。

在类中定义一个打印输出当前时间的方法:

import time

class TimeTest:
    
    @staticmethod
    def showtime():
        print(time.strftime("%H:%M:%S", time.localtime()))
  
nowtime = TimeTest()
TimeTest.showtime()    # 通过 类名 调用 静态方法

类方法

类方法通过在方法上面添加@classmethod装饰器,保存在类中。

类方法不需要传入self。但有一个系统自建参数为clscls代指类本身。

类方法一般通过类调用,也可通过对象调用。

class Demo:

    @classmethod        # 通过@classmethod装饰器将方法转为静态
    def clasmd(cls):    # 自建cls参数 代指 当前类
        print(cls)      # <class '__main__.Demo'>

d = Demo()
Demo.clasmd()    # 通过 类名 调用

总结

  • 访问字段:对象.字段名称
  • 访问方法:对象.方法名称([参数])

属性

在实际开发中,为了简便,当想访问方法以属性的访问形式时,就可以通过在方法上面添加@property装饰器,达到该效果。

class Demo:
    def __init__(self):
        self.name = "rose"

    @property
    def test(self):
        print(self.name)

d = Demo()
d.test    # 通过@property 以 普通属性 形式 访问 普通方法

⚠️注意: 以上@property只相当于一个只读属性,也就是说,仅能访问test函数的内容。

通过传参去改变self.name的值,删除掉self.name

class Demo:
    def __init__(self):
        self.name = "rose"

    @property
    def test(self):     # 只可访问模式
        print(self.name)

    @test.setter        # d.set_test = "jack"
    def test(self,para):
        self.name = para
        print(self.name)

    @test.deleter
    def test(self):    # del d.test 
        del self.name
        print(self.name)  # 报错  self.name已被删除

d = Demo()
d.test            # 通过@property 只读模式

# 改变self.name的值
d.test = "jack"   # 给方法传参 以 赋值方式 会触发@test.setter

# 删除self.name
del d.test        # del 会 触发 @test.deleter