Python基础之面向对象编程

本文介绍了Python中的面向对象编程,包括类和实例的创建、数据封装、访问限制、继承和多态的概念。还讲解了如何获取对象信息以及实例属性和类属性的差异。通过实例展示了如何定义和使用这些概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类和实例

  在python中,定义类是通过class关键字。

class Student(object):
	pass

  定义好了类,就可以通过类创建出类的实例,创建实例是通过类名+()实现的

bart = Student()

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

class Student(object):
	def __init__(self, name, score):
		self.name = name
		self.score = score

  __init__方法的第一个参数永远是self,表示创建的实例的本身,因此在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。

数据封装

class Student(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score
        
    def get_grade(self):
        if self.score >= 90:
            return 'A'
        elif self.score >= 60:
            return 'B'
        else:
            return 'C'
        
lisa = Student('Lisa', 90)
bart = Student('Bart', 59)
print(lisa.name, lisa.get_grade())
print(bart.name, bart.get_grade())

访问限制

  如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在python中,实例的变量名如果以__开头,就变成了一个私有变量,只有内部可以访问,外部不能访问。

class Student(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score
    
    def print_score(self):
        print('%s:%s' % (self.__name,self.__score))

  如果外部需要获得内部的属性或修改内部的属性,可以使用setget方法。

class Student(object):
	...
	def get_name(self):
		return self.__name
	def set_name(self, name):
		self.__name = name

继承和多态

  编写一个名为Animal的class,有一个run()方法可以直接打印:

class Animal(object):
    def run(self):
        print('Animal is running...')

class Dog(Animal):
    def run(self):
        print('Dog is running...')
    def eat(self):
        print('Dog is eating')

class Cat(Animal):
    pass

def run_twice(animal):
    animal.run()
    animal.run()

dog = Dog()
print(dog.run())

cat = Cat()
print(cat.run())

print(run_twice(Animal()))

获取对象信息

判断对象类型可以使用type()函数。基本类型都可以用type()函数判断,如果一个变量指向函数或者类,也可用type()判断。type()函数返回对应的class类型。

print(type(123))
print(type('str'))
print(type(abs))
print(type(123)==type('str'))

  要判断一个对象是否是函数,可以使用types模块中定义的常量

import types
def fn():
    pass
print(type(fn) == types.FunctionType)
print(type(abs) == types.BuiltinFunctionType)
print(type(lambda x: x) == types.LambdaType)
print(type((x for x in range(10))) == types.GeneratorType)

  对于class的继承关系来说,使用type()就很不方便,可以使用isinstance()函数。能用type()判断的基本类型也可以用isinstance()判断,并且还可以判断一个变量是否是某些类型中的一种。

h = Husky()
print(isinstance(h, Husky))
print(isinstance([1, 2, 3], (list, tuple)))

如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list。

print(dir('abc'))

  类似__xxx__的属性和方法在python中都是有特殊用途的,比如__len__方法返回长度。在python中,如果你调用len()函数试图获取一个对象的长度,实际上,在len()函数内部,它自动去调用该对象的__len__()方法,所以,下面的代码是等价的。

print(len('abc'))
print('abc'.__len__())

实例属性和类属性

给实例绑定属性的方法是通过实例变量,或者通过self变量

class Student(object):
    def __init__(self, name):
        self.name = name
        
s = Student('Bob')
s.score = 90

  给类本身绑定一个属性,可以直接在class中定义属性,这种属性是类属性,归类所有。

class Student(object):
    name = 'Student'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值