美文网首页
python 面向对象

python 面向对象

作者: 柒轩轩轩轩 | 来源:发表于2022-04-11 00:46 被阅读0次

    想把属性设为private 在前面加__

    获取对象信息

    type()

    我们来判断对象类型,使用type()函数

    type(123)
    #<class 'int'>
    

    但是type()函数返回的是什么类型呢?它返回对应的Class类型。如果我们要在if语句中判断,就需要比较两个变量的type类型是否相同

    import types
    type(lambda x: x)==types.LambdaType
    

    isinstance

    a = Animal()
    d = Dog()
    isinstance(d, Husky) #True
    

    dir()

    dir('ABC')
    ['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']
    

    类似xxx的属性和方法在Python中都是有特殊用途的,比如len方法返回长度。在Python中,如果你调用len()函数试图获取一个对象的长度,实际上,在len()函数内部,它自动去调用该对象的len()方法

    slot

    正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。

    def set_age(self, age): # 定义一个函数作为实例方法
        self.age = age
    from types import MethodType
    s.set_age = MethodType(set_age, s)
    s.set_age(25)
    
    

    同理,可以给Class绑定方法

    Student.set_score = set_score
    

    如果我们想要限制实例的属性怎么办?比如,只允许对Student实例添加name和age属性

    class Student(object):
        __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
    
    s = Student() # 创建新的实例
    s.name = 'Michael' # 绑定属性'name'
    s.age = 25 # 绑定属性'age'
    s.score = 99 # 绑定属性'score' #error
    

    使用slots要注意,slots定义的属性仅对当前类实例起作用,对继承的子类是不起作用的

    @property

    class Student(object):
    
        @property
        def score(self):
            return self._score
    
        @score.setter
        def score(self, value):
            if not isinstance(value, int):
                raise ValueError('score must be an integer!')
            if value < 0 or value > 100:
                raise ValueError('score must between 0 ~ 100!')
            self._score = value
    
    s = Student()
    >>> s.score = 60 # OK,实际转化为s.set_score(60)
    >>> s.score # OK,实际转化为s.get_score()
    60
    >>> s.score = 9999
    Traceback (most recent call last):
      
    

    多重继承

    class Runnable(object):
        def run(self):
            print('Running...')
    class Mammal(Animal):
        pass
    class Dog(Mammal, Runnable):
        pass
    

    枚举类

    from enum import Enum
    Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))))
    

    如果需要更精确地控制枚举类型,可以从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装饰器可以帮助我们检查保证没有重复值。

    相关文章

      网友评论

          本文标题:python 面向对象

          本文链接:https://www.haomeiwen.com/subject/xaknjltx.html