Python面向对象(一)

先贴一段类的代码


class Animal(object):
    # 类属性
    type = 'Animal'
    # 私有类属性
    __count = 0

    def __init__(self, name, sex=True):
        # 实例属性
        self.name = name
        # 私有实例属性
        self.__sex = sex

        Animal.__count += 1

    def say(self):
        pass

    def __str__(self):
        return "I'm a %s,My name is %s, male:%s" % (self.type, self.name, self.__sex)


class Cat(Animal):
    # 类属性
    type = 'Cat'

    def __init__(self, name, sex=True):
        super().__init__(name=name, sex=sex)

    def say(self):
        print("miao miao miao")


if __name__ == '__main__':
    cat1 = Cat('mimi')
    cat2 = Cat('mama')
    cat1.say()
    print(cat1)

    print(isinstance(cat1, Cat), isinstance(cat1, Animal), type(cat1))

    # 访问实例属性
    print(cat1.type)
    # 修改实例属性
    cat1.type = 'cat1'
    # 访问修改后的实例属性
    print(cat1.type)

    # 访问类属性
    print(Cat.type)

    # 强制访问实例私有属性
    print(cat1._Animal__sex)
    # 强制访问类私有属性
    print(Cat._Animal__count)


# 输出
# shell>  miao miao miao
# shell>  I'm a Cat,My name is mimi, male:True

# shell>  True True <class '__main__.Cat'>

# shell>  Cat
# shell>  cat1
# shell>  Cat

# shell>  True
# shell>  2
基础知识点
  • 类属性:定义在类内部,使用类访问
  • 实例属性:定义在类内部,并通过self或者实例访问
  • 开头为两个下划线的属性表示私有属性(如:self.__type),原则上只有类和实例自己能访问,其实外面也能访问,使用:下划线+类名+属性名(如:_Animal__type)这种方式强制访问
  • 判断类型使用:type()和isinstance(),isinstance可以判断包括父类在内的类型
  • set/get方法:使用@property装饰器,设置属性的set/get方法
class Animal(object):
    @property
    def sex(self):
        return self.__sex

    @sex.setter
    def sex(self, sex):
        if not isinstance(sex, bool):
            raise ValueError('name must be True or False!')
        self.__sex = sex

特殊方法
  • __init__()
    初始化属性
    子类使用super().__init__函数调用父类构造函数
  • __slots__()
    定义允许绑定的属性集合
class Animal(object):
    __slots__ = ('name', 'age', 'type') 
  • __str__()与__repr__()
    定制实例的字符串
  • __iter__与__next__()
    实现__next__方法的类称为迭代器,实现__iter__方法,其返回一个迭代器,称为可迭代对象,可用于for…in语法(详情见此

  • __getitem__
    实现此方法,即拥有类似list的行为,可通过下标访问,

  • __getattr__
    获取类属性的自定义方法,此方法有很多巧妙的用法
class Chain(object):

    def __init__(self, path=''):
        self._path = path

    def __getattr__(self, path):
        return Chain('%s/%s' % (self._path, path))

    def __str__(self):
        return self._path

    __repr__ = __str__

# 测试结果
# >>> Chain().status.user.timeline.list
# '/status/user/timeline/list'
  • __call__
    实现此方法的类,它的实例是一个可调用对象,可以向函数一样使用此类的一个对象
 class Student(object):
    def __init__(self, name):
        self.name = name

    def __call__(self):
        print('My name is %s.' % self.name)


# >>> s = Student('Michael')
# >>> s()
# My name is Michael.
# >>> callable(s)   # callable()函数判断是否是可调用对象
# True

枚举类
from enum import Enum, unique

@unique     # 用来检查重复值
class Weekday(Enum):
    Sun = 0
    Mon = 1
    Tue = 2
    Wed = 3
    Thu = 4
    Fri = 5
    Sat = 6

if __name__ == '__main__':
    sat = Weekday.Sat
    print(sat)
    print(sat.value)
    print(Weekday(3))

# 输出
# shell>  Weekday.Sat
# shell>  6
# shell>  Weekday.Wed

其他特性
  • python允许多重继承
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值