if __name__ == '__main__'一下的内容在被调用作为模块的时候不被执行
在自身被执行的时候运行
偏函数模块:functools
import functools
fun2=functools.partial(func1.base.....)
# -*- coding: utf-8 -*- OR
__init__():一般用于初始化一个类
创建实例的时候先执行__new__()再执行__init__()
数据的封装:类的内部定义函数操作,外部不知详情
类的三个重要概念: 对象,方法,模板
MethodType()绑定方法到类
class Student(object):
pass
def set_name(self, name):
self.name = name
#将方法绑定在类上(有None参数)
Student.set_name = MethodType(set_name,Student)
s1 = Student()
s2 = Student()
s3 = Student()
s1.set_name('tom')
s2.set_name('tony')
>>> print s1.name, ',', s2.name, ',', s3.name
tom , tony ,
Traceback (most recent call last):
File "<pyshell#15>", line 1, in <module>
print s1.name, ',', s2.name, ',', s3.name
AttributeError: 'Student' object has no attribute 'name'
如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问
class Student(object):
def __init__(self, name, score):
self.__name = name
self.__score = score
def print_score(self):
print('%s: %s' % (self.__name, self.__score))
但是如果要访问内部的属性,可以在类里面添加访问属性的方法
对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用run()方法。
对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了:
def run_twice(animal):
animal.run()
animal.run()
class Timer(object):
def run(self):
print('Start...')
run_twice(Timer)
type & insinstance :
>>> isinstance([1, 2, 3], (list, tuple))
True
>>> isinstance((1, 2, 3), (list, tuple))
True
获取对象的属性以及方法:
class MyObject(object):
def __init__(self):
self.x = 9
def power(self):
return self.x * self.x
obj = MyObject()
>>> hasattr(obj, 'x') # 有属性'x'吗?
True
>>> obj.x
9
>>> hasattr(obj, 'y') # 有属性'y'吗?
False
>>> setattr(obj, 'y', 19) # 设置一个属性'y'
>>> hasattr(obj, 'y') # 有属性'y'吗?
True
>>> getattr(obj, 'y') # 获取属性'y'
19
>>> obj.y # 获取属性'y'
19
>>> hasattr(obj, 'power') # 有属性'power'吗?
True
>>> getattr(obj, 'power') # 获取属性'power'
<bound method MyObject.power of <__main__.MyObject object at 0x10077a6a0>>
>>> fn = getattr(obj, 'power') # 获取属性'power'并赋值到变量fn
>>> fn # fn指向obj.power
<bound method MyObject.power of <__main__.MyObject object at 0x10077a6a0>>
>>> fn() # 调用fn()与调用obj.power()是一样的
81
实例属性&类属性:
千万不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。
使用__slots__
如果我们想要限制实例的属性怎么办?比如,只允许对Student实例添加name和age属性。
为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性
使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的:
>>> class GraduateStudent(Student):
... pass
...
>>> g = GraduateStudent()
>>> g.score = 9999