【玩转python】入门篇day17-类和对象

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、属性和方法私有化

面向对象的特点: 封装 继承 多态,狭义的封装: 更多体现在属性私有化和方法私有化,

  1. 私有属性:
    • 设置私有属性,格式是在属性的前面添加两个下划线,例如: self.__age = 18
    • 特点: 不能在类的外部直接访问,只能在类的内部访问.
  2. 私有方法:
    • 设置私有方法,格式实在方法的前面添加两个下划线,例如: 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__)    # 

类中常用的魔术方法: 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

上述代码中,当print输出person对象的时候会执行__repr__函数,当同时存在__repr__ __str__()的话会执行 __str__()

你可能感兴趣的:(【玩转python】入门篇,python,开发语言)