Python基础:一起来面向对象 (一)

类,一群有着相同属性和函数的对象的集合

如果你不满足于只做一个+CRUD“码农”,而是想成为一个优秀的工程师,那就一定要积极锻炼直觉思考和快速类比的能力,其是在找不到+bug+的时候
  
  类的示例:

class Document():
def init(self, title, author, context):
print(‘init function called’)
self.title = title
self.author = author
self.__context = context # __ 开头的属性是私有属性

def get_context_length(self):
    return len(self.__context)

def intercept_context(self, length):
    self.__context = self.__context[:length]

harry_potter_book = Document(‘Harry Potter’, ‘J. K. Rowling’, ‘… Forever Do not believe any thing is capable of thinking independently …’)

print(harry_potter_book.title)
print(harry_potter_book.author)
print(harry_potter_book.get_context_length())

harry_potter_book.intercept_context(10)

print(harry_potter_book.get_context_length())

print(harry_potter_book.__context)

########## 输出 ##########

init function called
Harry Potter
J. K. Rowling
10


AttributeError Traceback (most recent call last)
in ()
print(harry_potter_book.get_context_length())

—> 24 print(harry_potter_book.__context)

AttributeError: ‘Document’ object has no attribute ‘__context’

三问对象

1.如何在一个类中定义一些常量,每个对象都可以方便访问这些常量而不用重新构造?

答: 一般写成大字,与函数并列声明并赋值,注意是可以修改的。

2.如果一个函数不涉及到访问修改这个类的属性,而放到类外面有点不恰当,怎么做才能更优雅呢?

答: classmethod装饰器声明函数为类函数,最常用的功能用于定义不同的init函数,如create_empty_book函数创建的对象 context一定为’nothing’,这比直接构造要清晰一些.

staticmethod装饰器声明函数为静态函数,可以用来做一些简单独立的任务

class Document():

WELCOME_STR = 'Welcome! The context for this book is {}.'

def __init__(self, title, author, context):
    print('init function called')
    self.title = title
    self.author = author
    self.__context = context

# 类函数
@classmethod
def create_empty_book(cls, title, author):
    return cls(title=title, author=author, context='nothing')

# 成员函数
def get_context_length(self):
    return len(self.__context)

# 静态函数
@staticmethod
def get_welcome(context):
    return Document.WELCOME_STR.format(context)

empty_book = Document.create_empty_book(‘What Every Man Thinks About Apart from Sex’, ‘Professor Sheridan Simove’)

print(empty_book.get_context_length())
print(empty_book.get_welcome(‘indeed nothing’))

######### 输出 ##########

init function called
Welcome! The context for this book is indeed nothing.

3.既然类是一群相似的对象的集合,那么可不可以是一群相似的类的集合呢?

继承类在生成对象时不会自动调用父类的构造函数,必须在init()函数中显式调用父类中的构造函数 Entity.init(self, ‘document’)
当子类对象调用 get_context_length 函数时,如果没有实现此函数,会抛出get_context_length not implemented异常,这就使子类必须实现此函数。
父类中的print_title 函数体现了继承的优势,减少重复代码.

class Entity():
def init(self, object_type):
print(‘parent class init called’)
self.object_type = object_type

def get_context_length(self):
    raise Exception('get_context_length not implemented')

def print_title(self):
    print(self.title)

class Document(Entity):
def init(self, title, author, context):
print(‘Document class init called’)
Entity.init(self, ‘document’)
self.title = title
self.author = author
self.__context = context

def get_context_length(self):
    return len(self.__context)

class Video(Entity):
def init(self, title, author, video_length):
print(‘Video class init called’)
Entity.init(self, ‘video’)
self.title = title
self.author = author
self.__video_length = video_length

def get_context_length(self):
    return self.__video_length

harry_potter_book = Document(‘Harry Potter(Book)’, ‘J. K. Rowling’, ‘… Forever Do not believe any thing is capable of thinking independently …’)
harry_potter_movie = Video(‘Harry Potter(Movie)’, ‘J. K. Rowling’, 120)

print(harry_potter_book.object_type)
print(harry_potter_movie.object_type)

harry_potter_book.print_title()
harry_potter_movie.print_title()

print(harry_potter_book.get_context_length())
print(harry_potter_movie.get_context_length())

########## 输出 ##########

Document class init called

parent class init called

Video class init called

parent class init called

document

video

Harry Potter(Book)

Harry Potter(Movie)

77

120

抽像类的使用

抽象类是为父类而生的,不能对象化。如果有抽象函数也必须在子类中重写才能使用。

from abc import ABCMeta, abstractmethod

class Entity(metaclass=ABCMeta):
@abstractmethod
def get_title(self):
pass

@abstractmethod
def set_title(self, title):
    pass

class Document(Entity):
def get_title(self):
return self.title

def set_title(self, title):
    self.title = title

document = Document()
document.set_title(‘Harry Potter’)
print(document.get_title())

entity = Entity()

######### 输出 ##########
Harry Potter


TypeError Traceback (most recent call last)
in ()
print(document.get_title())

—> 23 entity = Entity()
entity.set_title(‘Test’)

TypeError: Can’t instantiate abstract class Entity with abstract methods get_title, set_title

参考:

极客时间《Python核心技术与实战》

原文:https://www.cnblogs.com/xiaoguanqiu/archive/2019/06/04/10973001.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值