244 lines
6.7 KiB
Plaintext
244 lines
6.7 KiB
Plaintext
=================================
|
||
Notes
|
||
Author: Flora Chen
|
||
-_- -_- -_- -_- -_- -_- -_- -_-
|
||
=================================
|
||
|
||
******面向对象******
|
||
******类class******
|
||
1. 类的定义
|
||
关键字:class
|
||
语法:
|
||
class 类名:
|
||
# 类里面的代码
|
||
|
||
类名命名规范:遵循标识符的命名规范,风格采用大驼峰命名法,例如CatType
|
||
|
||
示例:
|
||
class Cat:
|
||
pass
|
||
|
||
class Dog:
|
||
pass
|
||
|
||
class TestCase:
|
||
pass
|
||
|
||
2. 通过类创建对象
|
||
对象 = 类名()
|
||
关于对象,有人叫对象,也有人叫实例。
|
||
通过类来创建对象(实例化对象)。可以创建多个对象,每个对象的内存地址都不一样。
|
||
示例:
|
||
class Cat:
|
||
pass
|
||
|
||
# 通过类来创建对象(实例化对象)。可以创建多个对象,每个对象的内存地址都不一样。
|
||
kitty = Cat()
|
||
print(id(kitty)) # 输出结果:2108715911296
|
||
|
||
coffee = Cat()
|
||
print(id(coffee)) # 输出结果:2108716016880
|
||
|
||
******类属性和实例属性******
|
||
1. 类属性
|
||
这一类事物拥有的共同特征,我们通常会定义为类属性。
|
||
在类里面直接定义的变量,叫做类属性。
|
||
类属性:可以通过类和对象去访问
|
||
|
||
有两种方式可以访问类属性:
|
||
通过对象访问类属性:对象名.属性名。
|
||
通过类访问属性:类名.属性名。
|
||
|
||
示例:
|
||
class Cat:
|
||
# 类属性
|
||
leg = '四条腿'
|
||
tail = '长尾巴'
|
||
|
||
# 通过对象访问类属性:对象名.属性名
|
||
kitty = Cat()
|
||
print(kitty.leg) # 输出结果:四条腿
|
||
|
||
coffee = Cat()
|
||
print(coffee.tail) # 输出结果:长尾巴
|
||
|
||
# 通过类访问属性:类名.属性名
|
||
print(Cat.leg) # 输出结果:四条腿
|
||
|
||
2. 实例属性
|
||
每个对象的属性值都有可能不一样,就应该定义为实例属性(对象属性)。
|
||
实例属性的定义:对象.属性名=属性值。
|
||
对象属性(实例属性):只能对象自己能用。
|
||
示例:
|
||
class Cat:
|
||
# 类属性
|
||
leg = '四条腿'
|
||
tail = '长尾巴'
|
||
|
||
# 实例化对象
|
||
kitty = Cat()
|
||
coffee = Cat()
|
||
|
||
# 给对象添加属性
|
||
kitty.name = 'kitty'
|
||
kitty.age = 2
|
||
|
||
coffee.name = 'coffee'
|
||
coffee.age = 3
|
||
|
||
# 通过对象访问对象属性:对象名.属性名
|
||
print(kitty.name) # 输出结果:kitty
|
||
print(kitty.age) # 输出结果:2
|
||
|
||
print(coffee.name) # 输出结果:kitty
|
||
print(coffee.age) # 输出结果:3
|
||
|
||
3. 关于如何在类里面定义对象属性
|
||
定义在类里面的函数叫方法。
|
||
__init__方法:
|
||
初始化方法;
|
||
在创建对象的时候,会自动调用执行里面的代码。
|
||
关于方法中的第一个参数self:self代表对象,不用手动传参,调用该方法时会自动传入。
|
||
示例:
|
||
class Cat:
|
||
# 类属性
|
||
leg = '四条腿'
|
||
tail = '长尾巴'
|
||
def __init__(self):
|
||
# 初始化方法
|
||
print('这里是打印self', id(self), self)
|
||
print('这个是__init__方法在调用')
|
||
|
||
kitty = Cat() # 输出结果:这里是打印self 1396410304640 <__main__.Cat object at 0x00000145208A4880>
|
||
print('这里是打印kitty', id(kitty), kitty)
|
||
# 输出结果:这里是打印self 1396410304640 <__main__.Cat object at 0x00000145208A4880>
|
||
|
||
print('----------------------')
|
||
|
||
coffee = Cat() # 输出结果:这里是打印self 2197480466656 <__main__.Cat object at 0x000001FFA40AE8E0>
|
||
print('这里是打印coffee', id(coffee), coffee)
|
||
# 输出结果:这里是打印coffee 1796880263392 <__main__.Cat object at 0x000001A25E68E8E0>
|
||
|
||
__init__方法的作用:初始化对象属性
|
||
示例:
|
||
class Cat:
|
||
# 类属性
|
||
leg = '四条腿'
|
||
tail = '长尾巴'
|
||
def __init__(self, name, age, gender):
|
||
self.name = name
|
||
self.age = age
|
||
self.gender = gender
|
||
|
||
kitty = Cat('hello kitty', 1, 'female')
|
||
print(kitty.name)
|
||
|
||
coffee = Cat('coffee cat', 2, 'male')
|
||
print(kitty.age)
|
||
|
||
4. 类里面的方法
|
||
特征 + 行为
|
||
特征:属性(类属性和实例属性)
|
||
行为:方法(类方法和实例方法)
|
||
方法的本质就是类里面的函数。
|
||
|
||
|
||
实例方法:
|
||
第一个参数时self, self代表的是对象本身,哪个对象调用该方法,self就代表哪个对象。
|
||
实例方法只能通过对象去调用。
|
||
实例方法不能通过类去调用,调用会报错。
|
||
|
||
类方法:
|
||
@classmethod进行装饰(标识);
|
||
第一个参数时cls, cls代表的是类本身。
|
||
可以通过类和对象去调用。
|
||
|
||
静态方法:
|
||
@staticmethod进行装饰;
|
||
可以通过类和对象去调用。
|
||
|
||
示例:
|
||
class Cat:
|
||
# 类属性
|
||
leg = '四条腿'
|
||
tail = '长尾巴'
|
||
def __init__(self, name, age, gender):
|
||
self.name = name
|
||
self.age = age
|
||
self.gender = gender
|
||
|
||
# 实例方法
|
||
def skill_01(self, skill_name):
|
||
print('{}会{}!'.format(self.name, skill_name))
|
||
|
||
# 实例方法
|
||
def skill_02(self):
|
||
print('{}会爬树!'.format(self.name))
|
||
|
||
@classmethod
|
||
def class_method(cls):
|
||
print('这是一个类方法!')
|
||
print('打印cls', cls)
|
||
|
||
@staticmethod
|
||
def static_method():
|
||
print('这是一个静态方法!')
|
||
|
||
# 通过对象调用实例方法
|
||
kitty = Cat('hello kitty', 1, 'female')
|
||
kitty.skill_01('跳舞')
|
||
coffee = Cat('coffee cat', 2, 'male')
|
||
coffee.skill_02()
|
||
# 通过类迪调用实例方法
|
||
# Cat.skill_02() # 报错:TypeError: skill_02() missing 1 required positional argument: 'self'
|
||
print('-------------------------')
|
||
# 通过类访问类方法:类名.类方法名
|
||
Cat.class_method()
|
||
# 通过对象调用类方法:对象名.类方法名
|
||
kitty.class_method()
|
||
print('-------------------------')
|
||
# 通过类访问静态方法:类名.类方法名
|
||
Cat.static_method()
|
||
# 通过对象调用静态方法:对象名.类方法名
|
||
kitty.static_method()
|
||
|
||
5. 关于类方法,静态方法,实例方法的应用场景
|
||
类方法:在方法内部只会使用到类属性。
|
||
静态方法:方法内部既不会使用类相关的属性和方法, 也不会使用实例(对象)相关的属性和方法。
|
||
实例方法:在方法内部会使用到对象相关的属性或方法,那么适合定义为对象方法。
|
||
示例:
|
||
class Cat:
|
||
# 类属性
|
||
leg = '四条腿'
|
||
tail = '长尾巴'
|
||
|
||
def __init__(self, name, age, gender):
|
||
# 实例(对象)属性
|
||
self.name = name
|
||
self.age = age
|
||
self.gender = gender
|
||
|
||
# 实例方法
|
||
def skill_01(self):
|
||
print('{}会跳舞!'.format(self.name))
|
||
self.move()
|
||
def move(self):
|
||
print('快速移动')
|
||
|
||
# 类方法
|
||
@classmethod
|
||
def class_method(cls):
|
||
print('这是猫类的共同特征:{}{}!'.format(cls.leg, cls.tail))
|
||
print('打印cls', cls)
|
||
|
||
#静态方法
|
||
@staticmethod
|
||
def static_method():
|
||
print('里面的代码和类和对象没有太多相关性!')
|
||
|
||
kitty = Cat('kitty', 1, 'female')
|
||
kitty.skill_01()
|
||
|
||
|
||
|