python(9)类和对象及常用魔法方法

python(9)类和对象

类的基本使用

class Student(object):
属性
方法

实例化:bart = Student()
构造方法:init

class Student(object):

    def __init__(self, name, score):
        self.name = name
        self.score = score

私有变量:__开头

class Student(object):

    def __init__(self, name, score):
        self.__name = name
        self.__score = score

  
    def get_name(self):
        return self.__name

    def get_score(self):
        return self.__score
    def set_score(self, score):
        self.__score = score    

类的继承:

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

class Dog(Animal):
    pass

class Cat(Animal):
    pass

类常用函数:

  1. type()函数:
>>> type(123)
<class 'int'>
>>> type('str')
<class 'str'>
>>> type(abs)
<class 'builtin_function_or_method'>
>>> type(a)
<class '__main__.Animal'>
  1. isinstance()
>>> isinstance(h, Husky)
True
  1. dir()
    获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list
>>> dir('ABC')
  1. getattr()、setattr()以及hasattr()
 class MyObject(object):
 		 def __init__(self):
           self.x = 9
         def power(self):
         	return self.x * self.x
 obj = MyObject()

紧接着,可以测试该对象的属性:

>>> hasattr(obj, 'x') # 有属性'x'吗?
True
>>> hasattr(obj, 'y') # 有属性'y'吗?
False

>>> setattr(obj, 'y', 19) # 设置一个属性'y'


>>> getattr(obj, 'y') # 获取属性'y'
19


>>> getattr(obj, 'z', 404) # 获取属性'z',如果不存在,返回默认值404
404

>>> hasattr(obj, 'power') # 有属性'power'吗?
True

>>> fn = getattr(obj, 'power') # 获取属性'power'并赋值到变量fn
>>> fn
>>> fn() # 调用fn()与调用obj.power()是一样的
  1. slots
    只允许对Student实例添加name和age属性。
class Student(object):
    __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
s = Student()
s.score = 99 # 绑定属性'score'

由于’score’没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttributeError的错误。

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

  1. str
    我们先定义一个Student类,打印一个实例:
class Student(object):
    def __init__(self, name):
         self.name = name
     def __str__(self):
        return 'name: %s' % self.name

 print(Student('Michael'))
  1. iter()和__next__()
    返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的__next__()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。

写一个迭代Fib类,可以作用于for循环:

class Fib(object):
    def __init__(self):
        self.a, self.b = 0, 1 # 初始化两个计数器a,b

    def __iter__(self):
        return self # 实例本身就是迭代对象,故返回自己

    def __next__(self):
        self.a, self.b = self.b, self.a + self.b # 计算下一个值
        if self.a > 100000: # 退出循环的条件
            raise StopIteration()
        return self.a # 返回下一个值

现在,试试把Fib实例作用于for循环:

>>> for n in Fib():
...     print(n)
...
1
1
2
3
5
...
46368
75025
  1. getitem
    取第5个元素:
class Fib(object):
    def __getitem__(self, n):
        a, b = 1, 1
        for x in range(n):
            a, b = b, a + b
        return a
>>> f[0]
1
>>> f[1]
1

10 call

任何类,只需要定义一个__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() 

装饰器

  1. @property
    Python内置的@property装饰器就是负责把一个方法变成属性调用的:
class Student(object):
#把一个getter方法变成属性
    @property
    def score(self):
        return self._score
#把一个setter方法变成属性赋值
    @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.score = 60
2. @classmethod
3. @staticmethod静态方法,只能类使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值