python入门之面向对象

对象是指将很多零散的东西封装成一个整体
Python是一门面向对象的编程语言(OOP),Python的所有数据类型都是对象,这与其他语言不同
面向过程和面向对象都是解决问题的思想策略
面向过程在解决问题的时候关注的是解决问题的每一个过程或步骤
面向对象关注的是在解决问题时所需要的对象
面向对象是对面向过程的封装

类是抽象的,对象是具体的,根据对象可以抽象出类,类可以实例化对象

# 类
# 1、 定义类:  class 类名:
# 类名命名方法为驼峰发法,即单词的首字母大写
# 根据类实例化一个对象:  对象名 = 类名()
# 查看一个对象的所有属性,可以利用:对象名.__dict__,返回由对象所有属性组成的一个列表
class People:
    age = 12
    sex = "f"
p1 = People()
print(p1.age)     # 结果12,若在对象中没有找到相应的属性,则到对象的所属类中进行查找
# 查看一个对象所属的类,可以用:对象.__class__

# 要限制类中对象的属性,可以在类中添加__slots__ = [属性]
class People:
    __slots__ = ["age", "height"]  # 限制类中属性只能是这两个


# 面向对象中方法的划分(方法即函数),划分依据为方法中第一个参数接收的数据类型:
# 实例方法:在实现的过程中需要使用实例,第一个参数必须是实例,即对象,
# 格式为def  方法名(self),self为实例
# 类方法:在实现的过程中需要使用类,第一个参数的数据类型必须是类,格式为
# @classmethod
# def 方法名(cla), cla为类
# 静态方法:在实现的过程中不需要使用类也不需要使用实例,第一个默认参数什么也不用接收,格式为
# @staticmethod
# def 方法名()
# 相同点:三种方法都存在于类中

# 实例方法的调用:
# 方法1:标准方法,用实例进行调用,此时不需要传入第一个参数,解释器会自动把实例传递给第一个函数
class People:
    def behave(self, behavior):
        print(self, behavior)
p = People()
p.behave("study")
# 结果为<__main__.People object at 0x000001E0F05B7438> study,
# 前面一部分表明了p是类People的对象以及在内存中的地址,后面则是行为名称
# 方法2:利用实例方法的本质进行调用,实例方法本质就是函数,找到函数所在的位置进行调用,
# 第一个参数必须我们给出
People.behave(123, "study")  # 结果为123 study,此时必须传入两个参数
# 方法3:将实例方法赋值给另一个变量,再调用
func = People.behave
func(123, "study")   # 结果为123 study

# 类方法的调用
# # 方法1:利用类进行调用,不需要我们传入第一个参数,解释器会自动传入
# class Person:
#     @classmethod
#     def lei(cls,para2):
#         print(cls, para2)
# Person.lei(34)  # 结果为<class '__main__.Person'> 34
# # 方法2:利用类中的对象进行调用,此时对象会被忽略,而对象所属的类会被自动传入第一个参数
# p = Person()
# p.lei(34)   # 结果为<class '__main__.Person'> 34
# # 方法3:将类方法赋值给一个变量再调用,此时第一个参数也不需要我们传入
# func = Person.lei
# func(34)   # 结果为<class '__main__.Person'> 34

# 静态方法的调用
# 方法1:利用类进行调用,不需要我们传入第一个参数,解释器会自动传入
class Person:
    @staticmethod
    def sta(para):
        print(para)
Person.sta(34)  # 结果为34
# 方法2:利用类中的对象进行调用,此时对象会被忽略,而对象所属的类会被自动传入第一个参数
p = Person()
p.sta(34)   # 结果为34
# 方法3:将类方法赋值给一个变量再调用,此时第一个参数也不需要我们传入
func = Person.sta
func(34)  # 结果为34

# 类如果要访问实例属性,可以通过实例方法进行访问
# 类方法只能访问类属性,不能方法实例属性


# 类的补充
# 1、元类:是创建类对象的类
class Person:
    pass
p = Person()
print(p.__class__)  # 结果为<class '__main__.Person'>
print(Person.__class__)   # 结果为<class 'type'>
print(Person.__class__.__class__)  # 结果为<class 'type'>,说明"type"是最大的元类


# 项目文档的生成
# 方式1:利用help(pro)
# 方式2:利用内嵌模块 pydoc


# 受保护的属性:在属性前面加一个下划线,如 _age
# 私有属性:在属性前面加两个下划线,如 __age,Python中并没有私有机制,
# 只不过通过某种方式实现了伪私有,
# 当我们定义私有属性之后,解释器自动将该属性重命名,一般改为_类名__属性,
# 因此当我们在类外再用原来的名称访问这个属性时,肯定访问不了。
# 在命名的两边分别加两个下划线,说明是系统内置的东西


# 初始化函数  def __init__(self)
# 当我们创建好一个实例对象之后,会自动调用这个初始化函数,对这个对象进行初始化
class Person:
    def __init__(self):   # 初始化函数,将age这个公有属性初始化为18
        self.age = 18


# 将属性设置为只读属性的方法
# 先将所属的类继承object,将属性设置为私有属性,再写一个实例方法来获取属性,
# 最后用property装饰器来装饰这个方法,使得外界能够以使用属性的方式来调用这个方法,从而使属性只读而不能被修改
class Person(object):
    def __init__(self):  # 初始化函数,将age这个私有属性初始化为18
        self.__age = 18

    @property
    def age(self):
        return self.__age

p = Person()
print(p.age)  # 结果为18,这样就可以只访问age这个属性,而不能修改


# property这个装饰器可以将一个属性的操作方法与这个属性关联

# 经典类:没有继承object
# 新式类:继承object
# 判断是否是新式类还是经典类,则用:类名.__bases__
# 在Python3里定义一个类时默认为新式类,在Python2里需显示地继承object,才为新式类



class Person:
    pass

print(Person.__bases__)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值