1、类和对象
类: 具有多个特殊功能的个体的集合. 人类 犬类 猫科
对象: 在一个类中,具有特殊功能的一个个体,能够解决特定的事情,也被称为实例(instance)
下面通过代码定义一个最简单的类来理解类和对象
# 定义最简单的类
class Dog():
# 类属性
name = "小胡"
sex = "公"
# 方法
def eat(self):
print(self.name,'爱吃肉.....')
def say(self):
print('fahuo.....')
# 创建对象,相当于创建了两条狗
dog = Dog()
dog1 = Dog()
# 访问类中的属性
print(dog.name)
print(dog.sex)
# 访问类中的方法
dog.eat()
dog.say()
2、构造函数 VS 析构函数
构造函数的触发时机是:当创建完对象后,给对象传输属性时自动触发
析构函数: 与构造函数正好相反,当对象被销毁的时候,会自动触发.
先看下面的代码示例:
class GirlFriend():
# 构造函数 __init__() 参数是对象相关的属性
def __init__(self,name,age):
# 对象的属性
self.name = name
self.age = age
print('构造函数的触发时机是:当创建完对象后,给对象传输属性时自动触发')
# 对象的方法
def say(self):
print(self.name,'喊文豹,来啊来啊.......')
def sing(self):
print('唱歌给豹哥听......')
# 析构函数
def __del__(self):
print('我的触发时机是:当对象被销毁的时候,自动触发....')
# 创建对象
girl = GirlFriend("小红",18)
girl1 = GirlFriend('小兰',22)
print(girl.name)
print(girl.age)
print(girl1.name)
print(girl1.age)
- 上面代码示例中,当执行
girl = GirlFriend("小红",18)
创建对象的时候会同时执行构造函数__init__ - 当对象被销毁的时候就会执行析构函数__del__
3、属性和方法私有化
面向对象的特点: 封装 继承 多态,狭义的封装: 更多体现在属性私有化和方法私有化,
- 私有属性:
- 设置私有属性,格式是在属性的前面添加两个下划线,例如:
self.__age = 18
- 特点: 不能在类的外部直接访问,只能在类的内部访问.
- 设置私有属性,格式是在属性的前面添加两个下划线,例如:
- 私有方法:
- 设置私有方法,格式实在方法的前面添加两个下划线,例如:
def __kiss(self):
- 特点: 只能在类的内部访问,不能在类的外部访问.
- 设置私有方法,格式实在方法的前面添加两个下划线,例如:
4、get和set访问和设置私有属性和方法
get 函数 和 set 函数并不是系统的函数,而是自己定义的. 为了和封装的概念相吻合.一般会设置为 getXXX 和 setXXX,直接代码演示怎么通过get和set来访问和设置类的属性和方法
class Girl():
# 构造函数
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
# age为私有属性
self.__age = age
# 通过get函数访问私有属性,命名规则: get + 私有属性的名字(首字母大写)
def getAge(self):
return self.__age
# 通过set函数设置私有属性,命名规则: set + 私有属性的名字(首字母大写)
def setAge(self,age):
self.__age = age
# 创建对象
girl = Girl('兰兰','女',23)
print(girl.name)
print(girl.sex)
#上面的两个属性都不是私有属性,访问正常没问题
# 访问私有属性
# print(girl.__age) #这里的__age是私有属性,类外部无法正常访问
print(girl.getAge()) # 23 //通过类内部的getAge函数来访问
# 设置私有属性
girl.setAge(34)
print(girl.getAge()) # 34
5、property装饰器访问私有属性和私有方法
class Girl():
# 构造函数
def __init__(self,name,age):
self.name = name
# 私有属性
self.__age = age
# 通过装饰器的方式访问私有属性 相当于 getAge
@property
def age(self):
return self.__age
# 通过装饰器设置私有属性 语法:@ + 私有属性名 + setter 相当于 setAge
@age.setter
def age(self,age):
self.__age = age
# 创建对象
girl = Girl('花花',25)
# 通过装饰器的方式在类的外部直接访问私有属性
print(girl.age)
# 通过装饰器的方式在类的外部设置私有属性
girl.age = 34
print(girl.age)
6、类中常用的属性
__name__
: 通过类名访问,获取类名字符串.不能通过对象获取,会报错
__dict__
:获取类相关的信息(类方法\静态方法\成员方法等等) 返回的是一个字典, 通过对象访问获取的是该对象的信息,返回的是一个字典
__base__
: 通过类名访问,获取的是该类的父类. 返回是一个元组
class Ball():
# 构造函数
def __init__(self,name,weight):
self.name = name
self.weight = weight
# 创建对象
ball = Ball('篮球','0.5')
# 通过类名访问 __name__
# print(Ball.__name__) # Ball
# 不能通过对象访问 __name__ 会报错
# print(ball.__name__)
# 通过类名访问 __dict__ 返回的是一个字典
# print(Ball.__dict__)
# 通过对象访问 __dict__ 返回的是一个字典
# print(ball.__dict__) # {'name': '篮球', 'weight': '0.5'}
# 通过类名访问 __base__
# print(Ball.__base__) # <class 'object'>
类中常用的魔术方法: str() 和 repr()
__str__
的触发时机是: 当打印对象的时候自动触发.一般是以字符串的形式返回相关的信息.必须使用return 关键字.__repr__ ()
的作用和__str__()
类似.当两者都存在的时候,会触发__str__
class Person():
# 构造函数
def __init__(self,name,age):
self.name = name
self.age = age
def swim(self):
print('游泳的方法')
'''
def __str__(self):
return f"姓名:{self.name},年龄:{self.age}"
'''
def __repr__(self):
return f"姓名:{self.name},年龄:{self.age}"
# 创建对象
person = Person('三哥',23)
print(person) # 姓名:三哥,年龄:23