一、类的初识
类,是一群有着相同属性和方法的对象的集合。 我们先来看下面一个例子:
>>> class Foo:
... def __init__(self, name, age):
... self.name = name
... self.age = age
... self.__money = 100
... def get_name(self):
... return self.name
... def get_money(self):
... return self.__money
...
>>> f = Foo("joker",18)
>>> print(f.get_name)
<bound method Foo.get_name of <__main__.Foo object at 0x000001F4B8339438>>
>>> print(f.get_name())
joker
>>> print(f.get_money())
100
>>> print(f.name)
joker
>>> print(f.age)
18
>>> print(f.__money)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute '__money'
>>>
结合上面的例子,做几个名称解释: (1)、类:一群有着相似性事物的集合,对应上面的class(关键字),Foo是类名 (2)、对象:集合中的事物,由类生成,对应上面的f (3)、属性:对象的某个特征,对应上面的name,age,money (4)、方法:对象的某个动态能力,对应上面的getname(),getmoney() 从上面可以看到class定义了一个类Foo,它的下面有三个方法,其中init()是构造方法,它会在生成对象的时候自动执行,而getname和getmoney是普通方法,由对象来调用。 Foo类有三个属性值(name,age,money),其中name和age是普通属性值,而__money是私有属性值,普通属性值可以使用对象调用得到具体的值,而私有的属性值只能在类中调用,对象无法调用,如果需要获得私有属性值的内容,可以像上面定义一个方法,通过对象调用方法取得私有属性。
二、类的字段
类中的字段包含静态字段和普通字段。其中静态字段保存在类中,可以通过对象和类访问,普通字段保存在对象中,只能通过对象访问。 如下例子:
>>> class Foo:
... NAME = "中国"
... def __init__(self, city):
... self.city = city
...
>>> f = Foo("上海")
>>> print(f.NAME)
中国
>>> print(Foo.NAME)
中国
>>> print(f.city)
上海
>>> print(Foo.city)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: type object 'Foo' has no attribute 'city'
>>>
上面例子中NAME是静态字段,city是普通字段,静态字段NAME可以通过对象f和类Foo调用(如上),而普通字段只能通过对象f调用。
三、类的方法
类得方法分为: (1)、普通方法 (2)、静态方法 (3)、类方法 应用场景如下: (1)、如果对象中需要保存一些值,调用方法需要调用对象中的值,用普通方法; (2)、如果不需要对象中的值,用静态方法; (3)、在方法中如果需要当前的类名,用类方法;
>>> class Foo:
... def bar(self):
... print("bar")
... @staticmethod
... def static_method():
... print("static method")
... @staticmethod
... def static_method2(a,b):
... print(a,b)
... @classmethod
... def class_method(cls):
... print("class method",cls)
...
>>> f = Foo()
>>> f.bar()
bar
>>> Foo.bar(f)
bar
>>> f.static_method()
static method
>>> Foo.static_method()
static method
>>> Foo.static_method(1,2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: static_method() takes 0 positional arguments but 2 were given
>>> Foo.static_method2(1,2)
1 2
>>> Foo.class_method()
class method <class '__main__.Foo'>
>>>
上面定义了一个类Foo,它里面有普通方法bar(),有静态方法staticmethod(),staticmethod2(),还有类方法class_method(),其中@staticmethod表示该方法是静态方法,@classmethod表示该方法是类方法。它们都可以通过对象和类名调用,其中,如果用类名调用普通方法,是要传对象名的,调用静态方法,不用传参数,调用类方法也不用传参数。