Python学习—面向对象编程

面向对象编程OOP

OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数

类和实例

  • 类是创建实例的模板,而实例则是一个一个具体的对象,各个实例拥有的数据都互相独立,互不影响

类和实例

  • 类是抽象的模板
  • 如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类
# 定义学生类
class Student(object):
	pass

# 创建学生类的一个实例
stu = Student()

# 对实例绑定属性
stu.name = "薛之谦"

和静态语言不同,Python允许对实例变量绑定任何数据,也就是说,对于两个实例变量,虽然它们都是同一个类的不同实例,但拥有的变量名称都可能不同

由于类起到模板的作用,所以可以在创建实例的时候,通过定义一个特殊的__init__方法,把一些我们认为必须绑定的属性强制填写进去。

class Student(object):
	# self表示创建的实例本身
    def __init__(self, name, score):
    	# 在__init__方法内部,把各种属性绑定到self,即实例本身
        self.name = name
        self.score = score
  • 有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去
  • 和普通的函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self,并且,调用时,不用传递该参数

数据封装

  • 定义类的方法进行数据封装
  • 调用方法时,不需要知道内部实现细节

访问限制

  • 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问
  • 增加get、set方法以允许外部代码修改内部私有数据
# 定义学生类
class Student(object):
    def __init__(self, name, gender):
        self.name = name
        self.__gender = gender
    
    # 定义get方法
    def get_gender(self):
        return self.__gender
	# 定义set方法
    def set_gender(self,gender):
        if gender == "male" or "female":
            self.__gender = gender
        else:
            print("输入格式有误!")

bart = Student('Bart','male')

# 验证参数有效性
if bart.get_gender() != 'male':
    print("测试失败")
else:
    bart.set_gender('female')
    if bart.get_gender()!='female':
        print('测试失败')
    else:
        print('测试成功')

继承和多态

  • 继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写。
  • 动态语言的鸭子类型特点决定了继承不像静态语言那样是必须的。
  • 廖雪峰Python教程-继承和多态

获取对象信息

type()函数

  • 使用type()函数来判断对象类型
>>> type(123)
<class 'int'>
>>> type('str')
<class 'str'>
>>> type(None)
<type(None) 'NoneType'>
  • 如果一个变量指向函数或者类,也可以用type()判断
>>> type(abs)
<class 'builtin_function_or_method'>
>>> type(a)
<class '__main__.Animal'>
  • 判断一个对象是否是函数,可以使用types模块中定义的常量
>>> import types
>>> def fn():
...     pass
...
>>> type(fn)==types.FunctionType
True
>>> type(abs)==types.BuiltinFunctionType
True
>>> type(lambda x: x)==types.LambdaType
True
>>> type((x for x in range(10)))==types.GeneratorType
True

instance()函数

  • isinstance()判断的是一个对象是否是该类型本身,或者位于该类型的父继承链上
  • 能用type()判断的基本类型也可以用isinstance()判断
>>> isinstance('a', str)
True
>>> isinstance(123, int)
True
>>> isinstance(b'a', bytes)
True
  • 判断一个变量是否是某些类型中的一种
>>> isinstance([1, 2, 3], (list, tuple))
True
>>> isinstance((1, 2, 3), (list, tuple))
True

dir()函数

  • 获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list
>>> dir('ABC')
['__add__', '__class__',..., '__subclasshook__', 
'capitalize', 'casefold',..., 'zfill']
  • 通过内置的一系列函数,我们可以对任意一个Python对象进行剖析,拿到其内部的数据。

实例属性和类属性

  • Python是动态语言,根据类创建的实例可以任意绑定属性
  • 不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,访问到的将是类属性
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值