类相当于一个模板,依据这样的模板来创建对象

  • 实例属性和实例方法属于对象,通过对象调用
  • 类属性和类方法属于类,通过类调用

    构造方法

    类中的 init() 方法 ,是一个特殊的方法,用来创建和初始化实例属性的,构造方法又叫初始化函数。
    语法: init(self, <变量1>, <变量2>,<…>)

  • init 两边是双下划线

  • 第一个参数必须是 self ```python class Animal(object): def init(self, name, age = 20): # 构造方法第一个参数必须是 self,可以带有默认值的变量
    1. self.name = name # 创建和初始化实例变量 name
    2. self.age = age # 实例变量就是给对象赋值

dog = Animal(‘tom’) # 创建一个叫 tom 的狗的实例,调用时不需要传入 self 参数 cat = Animal(‘jerry’, 25) # 创建一个 25 岁叫 jerry 的猫的实例

print(f’这只狗叫 {dog.name},今年 {dog.age}’) # 对实例变量通过 对象.实例变量 形式访问 print(f’这只狗叫 {cat.name},今年 {cat.age}’)

  1. > 在创建⼀个对象时,初始化函数自动被调用,不需要手动调⽤。同时一个类可以创建多个不同实例,赋予不同属性值
  2. <a name="pheXi"></a>
  3. ###
  4. <a name="p3o5K"></a>
  5. ### self
  6. **self **指的是**当前的实例对象。同时类中所有方法都要以 self 作为第一个参数传递进去**
  7. ```python
  8. # coding=utf-8
  9. class Washer(object):
  10. def wash(self): # 类方法第一个参数必须是 self,所有 self 指的是 dog 这个实例
  11. print('洗衣服')
  12. print(self) # 打印 self 地址
  13. haier = Washer()
  14. print(haier)
  15. haier.wash()
  16. -----------------------------------------------------------------------------------
  17. >>> <__main__.Washer object at 0x10d2bc850>
  18. >>> 洗衣服
  19. >>> <__main__.Washer object at 0x10d2bc850>

通过上述打印结果法相,self 的地址和实例的地址一样,说明 self 指的是当前实例对象。

变量

  • 变量,用于保存类或对象的数据。
    • 变量分为 实例变量 和 类变量
    • 变量既可以在类外面添加和获取,也能在类里面添加和获取

实例变量

  • 类外通过 实例名.变量名 = 值 添加。只能对当前实例生效 ```python class Animal(object): def play(self):
    1. print('打球')

dog = Animal()

dog.name = ‘tom’

print(dog.name) # 通过 实例名.变量名 获取属性

  1. - 类内通过 **实例名**(**self).变量名 **添加实例变量。**实际编程中使用 初始化函数 ,不推荐使用该方法**
  2. ```python
  3. class Animal(object):
  4. def paly(self):
  5. print(f'这条狗名字叫{self.name}') # 在类内部通过 self.属性名 添加实例属性
  6. dog = Animal()
  7. dog.name = 'jerry'
  8. dog.paly() # 通过实例调用方法获取属性
  9. ------------------------------------------------------------------------------------------
  10. >>> 这条狗叫 jerry

类属性

即类变量,就是 类对象 所拥有的变量,即它被该类的所有实例对象所共有。类属性可以使用 类对象 或 实例对象 访问

  • 访问类变量 ```python class Animal(object): age = 5 # 定义类变量 def init(self, name):
    1. self.name = name

dog = Animal(‘jerry’)

print(Animal.age) # 通过 类名.类变量名 访问

dog.age # 通过 实例.类变量名 访问

5 5 ```

  • 修改类属性 ```python class Animal(object): age = 5

dog = Animal() cat = Animal()

Aninmal.age = 10 # 通过 类对象 修改 类属性 print(Animal.age) print(dog.age)

print(cat.age)

10 10 10 ``` 类属性只能通过 类对象 修改。如果通过实例对象修改其实是创建一个实例属性并非修改类属性

方法

实例方法

实例方法与实例变量一样,都是某个实例(对象)特有的方法

  • 不传参数的实例方法 ```python class Animal(object): def play(self): # 第一个参数必须是 self
    1. print('旺旺')

dog = Animal() # 生成一个实例 dog.play() # 通过 实例名.实例方法() 进行方法调用 dog.speak(‘汪 汪 汪’) # 调用时要传入实参

  1. > 定义实例方法时,第一个参数是 self,就会将当前实例与该方法绑定,说明该方法属于实例,类无法调用该方法。在调用方法时不需要传入 self
  2. - **传递参数的实例方法**
  3. ```python
  4. class Animal(object):
  5. def eat(self, food): # 设置形参
  6. print(f'在吃{food}')
  7. dog = Animal()
  8. dog.eat('旺旺雪饼') # 传递实参,通过 实例名.方法() 进行调用
  9. ---------------------------------------------------------------------
  10. >>> 在吃旺旺雪饼

类方法

类方法和类变量类似,属于类,不属于实体。但是,在定义类方法时他的第一个参数不是 self,而是类本身,即 cls
定义类方法需要装饰器,装饰器以 @ 为开头修饰函数、方法和类

装饰器 @classmethod 来标识其为类方法

  1. class Person(object):
  2. def eat(self):
  3. print('hello world')
  4. @classmethod # 声明类方法
  5. def greet(cls): # cls 代表类自身,即 Person 类;cls 可以用 Person 替换
  6. print('hello kuma')
  7. Person.greet() # 类名.类方法 调用
  8. p = Person() # 使用实例调用
  9. p.greet()
  10. ---------------------------------------------------------------------------------------
  11. >>> hello kuma
  12. >>> hello kuma

类方法可以访问类变量和其他类方法,但不能访问其他实例方法和实例变量

静态方法

装饰器 @staticmethod 来标识其为静态方法

  1. class Person(object):
  2. def eat(self):
  3. print('hello world')
  4. @staticmethod
  5. def eat(): # 静态方法既不需要传递类对象也不需要传递实例对象( 形参没有 self/cls )
  6. print('安静恰饭')
  7. Person.eat()
  8. p = Person()
  9. p.eat()
  10. -----------------------------------------------------------------------------------------------
  11. >>> 安静恰饭
  12. >>> 安静恰饭

当方法中 既不需要使用实例对象,也不需要使用类对象,用静态方法