暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

笔记 | Python之类的初识

乔克的好奇心 2019-09-15
166


一、类的初识

类,是一群有着相同属性和方法的对象的集合。
我们先来看下面一个例子:

  1. >>> class Foo:

  2. ... def __init__(self, name, age):

  3. ... self.name = name

  4. ... self.age = age

  5. ... self.__money = 100

  6. ... def get_name(self):

  7. ... return self.name

  8. ... def get_money(self):

  9. ... return self.__money

  10. ...

  11. >>> f = Foo("joker",18)

  12. >>> print(f.get_name)

  13. <bound method Foo.get_name of <__main__.Foo object at 0x000001F4B8339438>>

  14. >>> print(f.get_name())

  15. joker

  16. >>> print(f.get_money())

  17. 100

  18. >>> print(f.name)

  19. joker

  20. >>> print(f.age)

  21. 18

  22. >>> print(f.__money)

  23. Traceback (most recent call last):

  24. File "<stdin>", line 1, in <module>

  25. AttributeError: 'Foo' object has no attribute '__money'

  26. >>>

结合上面的例子,做几个名称解释:
(1)、类:一群有着相似性事物的集合,对应上面的class(关键字),Foo是类名
(2)、对象:集合中的事物,由类生成,对应上面的f
(3)、属性:对象的某个特征,对应上面的name,age,money
(4)、方法:对象的某个动态能力,对应上面的getname(),getmoney()
从上面可以看到class定义了一个类Foo,它的下面有三个方法,其中init()是构造方法,它会在生成对象的时候自动执行,而getname和getmoney是普通方法,由对象来调用。
Foo类有三个属性值(name,age,money),其中name和age是普通属性值,而__money是私有属性值,普通属性值可以使用对象调用得到具体的值,而私有的属性值只能在类中调用,对象无法调用,如果需要获得私有属性值的内容,可以像上面定义一个方法,通过对象调用方法取得私有属性。

二、类的字段

类中的字段包含静态字段和普通字段。其中静态字段保存在类中,可以通过对象和类访问,普通字段保存在对象中,只能通过对象访问。
如下例子:

  1. >>> class Foo:

  2. ... NAME = "中国"

  3. ... def __init__(self, city):

  4. ... self.city = city

  5. ...

  6. >>> f = Foo("上海")

  7. >>> print(f.NAME)

  8. 中国

  9. >>> print(Foo.NAME)

  10. 中国

  11. >>> print(f.city)

  12. 上海

  13. >>> print(Foo.city)

  14. Traceback (most recent call last):

  15. File "<stdin>", line 1, in <module>

  16. AttributeError: type object 'Foo' has no attribute 'city'

  17. >>>

上面例子中NAME是静态字段,city是普通字段,静态字段NAME可以通过对象f和类Foo调用(如上),而普通字段只能通过对象f调用。

三、类的方法

类得方法分为:
(1)、普通方法
(2)、静态方法
(3)、类方法
应用场景如下:
(1)、如果对象中需要保存一些值,调用方法需要调用对象中的值,用普通方法;
(2)、如果不需要对象中的值,用静态方法;
(3)、在方法中如果需要当前的类名,用类方法;

  1. >>> class Foo:

  2. ... def bar(self):

  3. ... print("bar")

  4. ... @staticmethod

  5. ... def static_method():

  6. ... print("static method")

  7. ... @staticmethod

  8. ... def static_method2(a,b):

  9. ... print(a,b)

  10. ... @classmethod

  11. ... def class_method(cls):

  12. ... print("class method",cls)

  13. ...

  14. >>> f = Foo()

  15. >>> f.bar()

  16. bar

  17. >>> Foo.bar(f)

  18. bar

  19. >>> f.static_method()

  20. static method

  21. >>> Foo.static_method()

  22. static method

  23. >>> Foo.static_method(1,2)

  24. Traceback (most recent call last):

  25. File "<stdin>", line 1, in <module>

  26. TypeError: static_method() takes 0 positional arguments but 2 were given

  27. >>> Foo.static_method2(1,2)

  28. 1 2

  29. >>> Foo.class_method()

  30. class method <class '__main__.Foo'>

  31. >>>

上面定义了一个类Foo,它里面有普通方法bar(),有静态方法staticmethod(),staticmethod2(),还有类方法class_method(),其中@staticmethod表示该方法是静态方法,@classmethod表示该方法是类方法。它们都可以通过对象和类名调用,其中,如果用类名调用普通方法,是要传对象名的,调用静态方法,不用传参数,调用类方法也不用传参数。

文章转载自乔克的好奇心,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论