资讯专栏INFORMATION COLUMN

python难点:面向对象编程(OOP)

stonezhu / 2615人阅读

摘要:学习廖雪峰官方网站教程总结面向对象编程总结,供日后参考类和实例类的定义限制实例只能添加指定的属性类属性初始化值,创建实例必须绑定的属性变量设置,保证类内部数据安全创建类,实质上是元类,类的定义本质上就是利用创建类先定义函数创建实例报错,不能

学习廖雪峰官方网站python教程总结
python面向对象编程OOP(Object Oriented Programming)总结,供日后参考
1.类和实例

#类的定义
class Student(object):
    #限制实例只能添加指定的属性
    __slots__ = ("sex","age")
    #类属性
    school = "QingHua"
    #初始化值,创建实例必须绑定的属性
    def __init__(self,name,score):
        #private变量
        self.__name = name
        self.__score = score
    #设置getter,setter保证类内部数据安全
    def get_name(self):
        return self.__name
    def get_score(self):
        return self.__score
    def set_name(self,name):
        self.__name = name
    def set_score(self,score):
        self.__score = score
    def hello(self,name="world"):
        print("Hello, %s." % name)
#type()创建类,type()实质上是元类(metaclass),类的定义本质上就是利用type()创建类
def fn(self, name="world"): # 先定义函数
    print("Hello, %s." % name)
Student = type("Student",(object,),dict(hello=fn))

#创建实例
jim = Student("Jim",120)
print(jim.school) #QingHua
print(jim.name) #Jim
print(Student.school) #QingHua
jim.age = 20
jim.height = 170 #报错,不能添加__slots__未指定的属性

2.@property
上例中,为了保护内部数据的安全,我们使用setter,getter方式封装数据,能够防止用户随心所欲地修改数据,但是不够简洁。使用@property装饰器可以帮助我们改造成我们想要的样子

class Student(object):
    def __init__(self,birth):
        #private变量
        self.__birth = birth
    @property 
    def birth(self):
        return self.__birth
    @birth.setter
    def birth(self,value):
        self.__birth = value
    @property
    def age(self):
        return 2018-self.__birth
#birth为可读写属性,age是只读属性
s = Student(1995)
s.birth #实际转化为s.get_birth  结果:1995
s.birth = 1996 #实际转化为s.set_birth 
s.age #22
s.age = 20 #报错,当前age为只读属性

3.继承和多态

class Animal(object):
    def run(self):
        print("Animal is running")
class Dog(Animal):
    def run(self):
        print("Dog is runing")
class Cat(Animal):
    pass
dog = Dog()
cat = Cat()
dog.run() #Dog is running Dog类重写了Animal的run方法
cat.run() #Animal is running Cat类继承了Animal的run方法

#多态
def run_log(obj):
    obj.run()
run_log(Animal()) #Animal is running
run_log(Dog()) #Dog is running
#传说中的file-like object
class other(object):
    def run():
        print("other is running")
#传入任何实现run方法的对象都可以,这就是动态语言多分魅力
run_log(other) #other is running

4.自定义类

#__str__让class作用于print()
class Student(object):
    def __init__(self,name):
        self.name = name
    def __str__(self):
        return "Student name:%s" % self.name
    #__repr__用于调试服务,__str__用于用户打印
    __repr__ = __str__
print(Student("Tom")) # Student name:Tom

#__iter__
#将class处理成tuple或list可迭代
class Fib(object):
    def __init__(self):
        self.a,slef.b = 0,1
    def __iter__(self):
        return self
    def __next__(self):
        self.a,self.b = self.b,self.a+self.b
        if self.a>100
            raise StopIteration()
        return self.a
for n in Fib():
    print(n)
#1 1 2 3 5 8 13 21 34 55 89   

#__getitem__()  __getattr__()  __call__()方法,以后用的时候具体了解

5.枚举类

from enum import Enum
Month = Enum("Month",("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"))
for name,member in Month.__members__.items():
    print(name,"=>",member,",",member.value)
#value属性自动赋给成员int变量,默认从1开始
#Enum派生自定义类

from enum import Enum,unique
@unique
class Weekday(Enum):
    Sun = 0
    Mon = 1
    Tue = 2
    Wed = 3
    Thu = 4
    Fri = 5
    Sat = 6
#@unique装饰器帮助我们检查保证没有重复值
    

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41372.html

相关文章

  • Python 面向对象编程OOP (一) 类,对象,属性,访问权限

    摘要:面向对象编程之旅编程是什么大家好,作为小白,最近学习了很多编程的知识,因为脑容量有限,特此一一按照学习顺序记录下来,如果哪里有错误,还请大神尽快指出,以免误导他人。。。继承也允许把一个派生类的对象作为一个基类对象对待。 Python面向对象编程之旅 OOP编程是什么 大家好,作为小白,最近学习了很多Python OOP编程的知识,因为脑容量有限,特此一一按照学习顺序记录下来,如果哪里有...

    hiyayiji 评论0 收藏0
  • Python 面向对象编程OOP (三) 类方法,静态方法

    摘要:类的方法概览首先回顾一下常见的三种方法实例接口方法类方法静态方法标准书写方式如下我们最常用的其实就是普通的接口方法,其他两个需要用类似装饰器的写法来标注。类方法接受一个作为参数,它是指向本身的,并不是所创建的实例。 类的方法概览 首先回顾一下Python OOP常见的三种方法: instance method 实例/接口方法 class method 类方法 static...

    JerryZou 评论0 收藏0
  • Python OOP 面向对象编程

    摘要:时代,如果需要手动继承,如多态多态是指,不同的子类对象调用相同的父类方法,会产生多态多样结果的编程特性。 参考:黑马程序员教程 - Python基础 面向对象 OOP三大特性,且三个特性是有顺序的: 封装 继承 多态 封装 指的就是把现实世界的事务,封装、抽象成编程里的对象,包括各种属性和方法。这个一般都很简单,不需要多讲。 唯一要注意的就是:推荐从小往大开始封装、开发类。比如手枪...

    weknow619 评论0 收藏0
  • [零基础学python]关于类的初步认识

    摘要:反对者在某些领域对此予以否认。下面再引用一段来自维基百科中关于的历史。类的更严格的定义是由某种特定的元数据所组成的内聚的包。类还可以有运行时表示形式元对象,它为操作与类相关的元数据提供了运行时支持。 在开始部分,请看官非常非常耐心地阅读下面几个枯燥的术语解释,本来这不符合本教程的风格,但是,请看官谅解,因为列位将来一定要阅读枯燥的东西的。这些枯燥的属于解释,均来自维基百科。 1、问题...

    王岩威 评论0 收藏0

发表评论

0条评论

stonezhu

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<