python Basic -面向对象中级,字段,方法,类方法,静态方法,属性

面向对象中级

字段 与 方法

什么是字段,什么是方法

class Father:
    def __init__(self,name):
        self.name = name
        print("Father.__init__()")

class Son(Father):
    def test(self):
        print("test")

obj = Son("Elon Musk")

obj.name
obj.test()
"""
Father.__init__()
test
"""

如上所示:
self.name = name : 这就是一个字段
def Test(self): : 这是一个方法

调用方法的时候需要加括号,而调用字段的时候是不需要加括号的。

静态字段

将字段写到类里面, 这样多个对象具有同一个值的时候只会保留一份。
普通字段,属于对象
静态字段,属于类

静态字段示例:

中国所有的省份,用面向对象知识表示:

class Province:
    # 静态字段,属于类
    country = "中国"

    def __init__(self,name):
        #普通字段,属于对象
        self.name = name

hubei = Province("湖北")
hunan = Province("湖南")
print(Province.country)

“”“
中国
”“”

普通字段属于对象,只能通过对象访问
静态字段属于类,执行时可以通过对象,也可以通过类访问

静态字段可以在不创建对象的情况下直接使用。

方法的调用方式

方法一:通过类创建对象,而后通过对象调用方法

class Foo:
    def show(self):
        print("show")

obj = Foo()
obj.show()

"""
show
"""

方法二:类直接调用方法

类调用方法,需要传递一个参数,这个参数是通过这个类创建的对象,所以通过类来调用方法的时候还是需要创建一个对象,操作的还是这个对象。

class Foo:
    def show(self):
        print("show")

obj = Foo()

Foo.show(obj)
"""
show
"""

静态方法(添加一个装饰器即可)

静态方法的特点

  • 静态方法可以在不创建对象的情况下直接调用
  • 静态方法在定义时不需要self参数,因为此方法不归对象,而属于类的。
  • 使用@staticmethod装饰器
class Foo:
    def show(self):
        print("show")
    @staticmethod
    def showstatic():
        print("showstatic")

Foo.showstatic()

"""
showstatic
"""

类方法

与静态方法比较类似,但是有一点不一样。
什么是类方法:类方法是将类本身做为对象进行操作的方法,
使用装饰器 @classmethod 关键字
cls :代指当前类对象

类方法的调用形式为可通过对象调用,也可以通过类调用

class Foo:
    def show(self):
        print("show")
    @classmethod
    def showclass(cls):
        print(cls)
        print("showclass")
#通过类调用
Foo.showclass()
#通过对象调用
obj = Foo()
obj.showclass()

"""
<class '__main__.Foo'>
showclass
<class '__main__.Foo'>
showclass
"""

cls是class的缩写
cls是类名,不依赖对象,执行的时候就可以不用对象了。又可以直接执行它。

小结:

  • 字段:
    • 普通字段:保存在对象中,执行只能通过对象访问
    • 静态字段:保存在类中,执行可能通过对象访问,也可以通过类访问
  • 方法:
    • 普通方法:保存在类中,由对象进行调用,self==> 对象
    • 静态方法:保存在类中,可由类直接调用
      • 类方法:保存在类中,可由类直接调用,cls==> 当前类

############ 使用场景
如果对象中需要保存一些值,执行某功能时需要使用对象中的值-----> 普通方法
不需要使用对象中的值,静态方法。

属性

定义的时候像方法,访问的时候像字段

class Foo:
    @property
    def propertyshow(self):
        print("propertyshow")


obj = Foo()
obj.propertyshow

"""
propertyshow
"""

返回值

对于方法来说可以有返回值,例如:

class Foo:
    @property
    def show(self):
        print("show")
        return 123


obj = Foo()
r = obj.show
print(r)

"""
show
123
"""

这叫创建了一个属性。或者叫特性。

为属性传递值

class Foo:
    @property
    def show(self):
        print("show")
        return 123
    @show.setter
    def show(self,name):
        print(name)


obj = Foo()
r = obj.show
print(r)

obj.show = 456
"""
show
123
456
"""

删除属性的值

class Foo:
    @property
    def show(self):
        print("show")
        return 123
    @show.setter
    def show(self,name):
        print(name)
    @show.deleter
    def show(self):
        print("666")


obj = Foo()
r = obj.show
print(r)

obj.show = 456
del obj.show
"""
show
123
456
666
"""

这里不是删掉。这里不管是setter还是deltter,目的都是伪造的它跟字段一样。它不会真实的去帮你删除,设置数据,如果这样写了,具体里面怎么做是自定义的。
只是一对一的关系。所以在setter里面也可以做delter的操作。只帮你执行一下里面的方法,但是具体里面做什么得自己定义。相当于就是一个对应关系。

也就是说这其实是3个方法,只是对应的,但是具体里面执行什么写代码的说了算。

示例

通常在做一些页面进行翻页的时候,需要写一个开始到结束,但是在调用start和end的时候后面不用加括号,这样看起来也非常清晰。所以功能也就这一点,就是为了去括号。

class Pergination:
    def __init__(self,current_page):
        try:
            p = int (current_page)
        except Exception as e:
            p = 1
        self.page = p

    @property
    def start(self):
        val = (self.page - 1) * 10
        return val

    @property
    def end(self):
        val = self.page * 10
        return val


li = []
for i in range(1000):
    li.append(i)

while True:
    p = input("请输入要查看的页码:") #1,每页显示10条
    obj = Pergination(p)
    print(li[obj.start:obj.end])# 这里如果不用写print(li[obj.start(),obj,end()])

"""
请输入要查看的页码:1
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
请输入要查看的页码:2
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
请输入要查看的页码:5
[40, 41, 42, 43, 44, 45, 46, 47, 48, 49]
请输入要查看的页码:
"""

类特殊方法

上面介绍了Python的类成员以及成员修饰符,从而了解到类中有字段,方法和属性三大类成员,并且成员名前如果有两个下划线,则表示该成员是私有成员,私有成员只能由类内部调用,存在在一些具有特殊含义的成员,如下所述

__doc__ 方法

用于表示类的描述信息

__module__

表示操作的对象在哪个模块

__class__

表示当前操作的对象的类是什么

在这里插入图片描述

property(fget())

def Foo():
    def functiontest(self):
        return 123

    per = property(fget=functiontest)

与下面的写法是一样的。fget 是get的一个函数。


def Foo2():
    
    def functiontest(self):
        return 123
    
    @property
    def per(self):
        return 123

property(fset())

用于向函数传递一个值,

class Foo():
    def functiontest(self):
        return 123

    def functiontest2(self,v):
        print(v)

    per = property(fget=functiontest,fset=functiontest2)

obj = Foo()
obj.per = 123456

"""
123456
"""

property(fdel())

del 的时候不需要传递参数

class Foo():
    def functiontest(self):
        return 123

    def functiontest2(self,v):
        print(v)

    def functiontest3(self):
        print("del")

    per = property(fget=functiontest,fset=functiontest2,fdel=functiontest3)


obj = Foo()
obj.per = 123456
del obj.per
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值