类属性
在面向对象编程中我们在类定义中的__init__方法中给属性赋值,在访问属性的时候必须先定义对象,然后通过set或者get方法访问属性。在某些情况下我们会发现所有对象的某个或者某些属性的值都是一样的,例如,我们中国人的国籍都是中国,这对于每个中国人来说都是一样的。既然对于每个对象来说这个属性的值都是一样的,能不能用别的方法来存储这个属性值呢?答案是肯定的,就是类属性。
类属性是指这个类的所有实例对象的这个属性值都是一样的。在类中,但是不是在__init__方法中定义的属性就是类属性。
class Dog:
type = "dog"
def __init__(self,name):
self.name = name
dog1 = Dog("白狗")
dog2 = Dog("黑狗")
print(dog1.type,dog2.type,Dog.type)
print(dog1.name,dog2.name)
Dog.type = "狼狗"
print(dog1.type,dog2.type,Dog.type)
结果:
dog dog dog
白狗 黑狗
狼狗 狼狗 狼狗
- 类属性可以使用类名访问,也能使用对象访问,这里的访问仅仅是指输出;
- 类属性只能由类名修改。
- 类属性存在的意义就是节省内存
类方法
当类属性是私有属性的时候就不能在类外边使用,在类属性的变量名前加双下划线就变成了私有属性。这样做得原因是为了保证这个属性值的安全性,让他不能被随意更改。访问私有的类属型需要使用类方法。定义类方法要用到classmethod修饰符,在这个修饰符下定义的第一个方法就是类方法。
class Dog:
__type = "dog"
@classmethod
def getType(cls):
return cls.__type
print(Dog.getType())
结果:
dog
- 类方法默认传递的第一个参数是cls
- 类方法可以使用类调用也可以使用对象调用
先看如下代码:
class Dog:
def eat(self):
print("吃狗粮")
如果你是在PyCharm中写这个代码,鼠标放在eat()方法上,Python解释器会提示“此方法可能是静态方法”。静态方法的意思就是在类的方法中有self或者cls参数,但是却没有使用。这样的函数往往在定义的时候self或者cls形参会在内存中开辟空间,调用的时候也需要传参。但是我们在代码中又没有使用这个参数,因此这种情况下将函数定义成“静态方法”更合适,主要的目的就是节省内存。定义静态方法需要使用staticmethod修饰符。
class Dog:
@staticmethod
def eat():
print("吃狗粮")
dog = Dog()
dog.eat()
Dog.eat()
结果:
吃狗粮
吃狗粮
静态方法可以使用对象调用也可以使用类调用。