面向对象
一、面向对象介绍
对象: 一个程序的基本单元, 一个对象包含了数据和操作数据的方法
1.1 基础概念
- 类(class):对具有相同数据或者方法的一组对象的集合
- 对象(obj):对象是一个类的具体事例
- 实例化:由类生成一个对象. 实例具有类的所用属性和方法.
- 类属性:属于一个类中所有对象的属性
- 实例属性:一个对象就是一组属性的集合
- 类方法:那些无须特定的对性实例就能够工作的从属于类的函数
- 实例(对象)方法:所有存取或者更新对象某个实例一条或者多条属性函数的集合
1.2 认识类
在python中一切皆对象, 类型的本质就是类.
python使用关键字class
定义类. 类名的命名采用大驼峰命名法
语法如下:
class ClassName:
class_attr = value # 类属性
def object_method_name(self, args, key=value, *args, **kwargs): # 实例方法
pass
二、属性
2.1 类属性
- 查询类属性
ClassName.class_attr
class Person:
sex = "male"
name = "dyp"
print(Person.name, Person.sex) # 输出 dyp male
- 修改类属性
ClassName.class_attr = value
class Person:
sex = "male"
name = "dyp"
print(Person.name) # 输出 dyp
Person.name = "Jone"
print(Person.name) # 输出Jone
- 增加类属性
ClassName.class_attr = value
class Person:
sex = "male"
name = "dyp"
print(dir(Person))
Person.age = 21
print(dir(Person))
- 删除属性
del ClassName.class_attr
class Person:
sex = "male"
name = "dyp"
del Person.name
print(Person.name) # 报错, 没有name属性
2.2 实例属性
实例 = 类名()
: 实例化, 复制类的所用属性和方法. 一个类可以生成多个实例, 每个实例有单独的内存空间.
- 实例属性查看
实例.obj_attr
class Person:
sex = "male"
name = "dyp"
person = Person() # 实例化Person
print(person.name, person.sex) # 查看实例的属性
- 修改实例属性
实例.obj_attr = value
class Person:
sex = "male"
name = "dyp"
person = Person() # 实例化Person
print(id(Person.name), id(person.name)) # 实例的属性未发生变化时, 引用 类的属性
person.name = "Jone" # 修改属性, 在实例的命名空间中新建一个对象, 赋值给实例属性名
print(id(Person.name), id(person.name)) # 实例属性发生变化后, 新建一个
- 增加实例属性
实例.obj_attr = value
class Person:
sex = "male"
name = "dyp"
person = Person() # 实例化Person
person.age = 20
print(person.age)
- 删除实例属性
del 实例.obj_attr
class Person:
sex = "male"
name = "dyp"
person = Person() # 实例化Person
person.age = 20
del person.age
三、方法
3.1 实例方法
class Cat:
def __init__(self, name): # 类的初始话方法, 当类实例化时, 触发此方法. 用于设置实例的特征属性
self.name = name
def eat(self): # 实例方法, 通过类生成的实例调用. 通过类调用时会报错
print(f"小猫{self.name}, 吃东西了")
cat = Cat("花花")
cat.eat() # 调用方法
四、受保护的属性和方法
只有当前类和当前类生成的实例可以访问, 继承此类的其他类和其生成的实例不能访问.
属性名或方法名前面有一个下划线(_
)成为受保护的属性或方法
class Person:
def __init__(self, name, birthday):
self.name = name
self._birthday = birthday # 受保护的属性, 属性名前面有一个下划线 _
def _age(self):
self.age = 24
person = Person("Jone", "1996-12-22")
print(person._birthday) # 查看受保护的属性
person._birthday = "1996-12-11" # 修改受保护的属性
person._age() # 调用受保护的方法
print(person.age)
五、私有属性和方法
只有类的内部才能访问属性和方法, 用于隐藏隐私信息
属性名或方法名前面有两个下划线(__
)成为私有的属性或方法
可以通过_ClassName__attr
访问私有属性, _ClassName_method()
调用受保护方法
class Cat:
__name = "花花"
def __test(self):
print(f"{self.__name}") # 在类的内部才能访问
def test(self):
self.__test()
cat = Cat()
# print(cat.__name) # 不能被访问
# print(Cat.__name) # 类外部, 类名也是不能访问是由属性或方法的
print(cat._Cat__name) # 私有的属性会被python重命名为 _ClassName__attrName
print(Cat._Cat__name) # 私有的属性会被python重命名为 _ClassName__attrName
cat._Cat__test() # 私有的方法会被python重命名为 _ClassName__methodName