面向对象主要术语:
- 多态(polymorphism):一个函数有多种表现形式,调用一个方法有多种形式,但是表现出的方法是不一样的。
- 继承(inheritance)子项继承父项的某些功能,在程序中表现某种联系
- 封装(encapsulation)把需要重用的函数或者功能封装,方便其他程序直接调用
- 类:对具有相同数据或者方法的一组对象的集合
- 对象:对象是一个类的具体事例
- 实例化:是一个对象事例话的实现
- 标识:每个对象的事例都需要一个可以唯一标识这个事例的标记
- 实例属性:一个对象就是一组属性的集合
- 事例方法:所有存取或者更新对象某个实例一条或者多条属性函数的集合。
- 类属性:属于一个类中所有对象的属性,
- 类方法:那些无须特定的对性实例就能够工作的从属于类的函数。
1、静态方法 (用这个装饰器来表示 @staticmethod )
意思是把 @staticmethod 下面的函数和所属的类截断了,这个函数就不属于这个类了,没有类的属性了,只不是还是要通过类名的方式调用
例:
错误示例:
class Person(object):
def __init__(self, name):
self.name = name
@staticmethod # 把eat方法变为静态方法
def eat(self):
print("%s is eating" % self.name)
d = Person("xiaoming")
d.eat()
##############
结果:
TypeError: eat() missing 1 required positional argument: 'self'
正确示例:
class Person(object):
def __init__(self, name):
self.name = name
@staticmethod # 把eat方法变为静态方法
def eat(x):
print("%s is eating" % x)
d = Person("xiaoming")
d.eat("jack")
#就把eat方法当作一个独立的函数给他传参就行了
因为用静态方法把eat这个方法与Person这个类截断了,eat方法就没有了类的属性了,所以获取不到self.name这个变量。
2、类方法 (用这个装饰器来表示 @classmethod)
类方法只能访问类变量,不能访问实例变量
例:
class Person(object):
name="杰克"
def __init__(self, name):
self.name = name
@classmethod # 把eat方法变为类方法
def eat(self):
print("%s is eating" % self.name)
d = Person("xiaoming")
d.eat()
3、属性方法 (用这个装饰器表示 @property)
把一个方法变成一个静态属性,属性就不用加小括号那样的去调用了
例
class Person(object):
def __init__(self, name):
self.name = name
@property # 把eat方法变为属性方法
def eat(self):
print("%s is eating" % self.name)
d = Person("xiaoming")
d.eat
4、成员修饰符
python的类中只有私有成员和公有成员两种,不像c++中的类有公有成员(public),私有成员(private)和保护成员(protected).并且python中没有关键字去修饰成员,默认python中所有的成员都是公有成员,但是私有成员是以两个下划线开头的名字标示私有成员,私有成员不允许直接访问,只能通过内部方法去访问,私有成员也不允许被继承。
class a: # 说明父类的私有成员无法在子类中继承
def __init__(self):
self.ge=123
self.__gene=456
class b(a):
def __init__(self,name):
self.name=name
self.__age=18
super(b,self).__init__() # 这一行会报错
def show(self):
print(self.name)
print(self.__age)
print(self.ge)
print(self.__gene) # 这一行也会报错
obj=b("xiaoming")
print(obj.name)
print(obj.ge)
# print(obj.__gene) # 这个也会报错
obj.show()
5、类与对象
__new__和__metaclass__
在python中,一切皆对象,我们定义的类其实。。。也是一个对象,那么,类本身是谁的对象呢?在python2.2之前(或者叫经典类中),所有的类,都是class的对象,但是在新式类中,为了将类型(int,str,float等)和类统一,所以,所有的类都是type类型的对象。当然,这个规则可以被修改,在类中有一个属性 __metaclass__ 可以指定当前类该由哪个类进行实例化。而创建对象过程中,其实构造器不是__init__方法,而是__new__方法,这个方法会返回一个对象,这才是对象的构造器。下面是一个解释类实例化对象内部实现过程的代码段:
class Mytype(type):
def __init__(self, what, bases=None, dict=None):
super(Mytype,self).__init__(what, bases, dict)
def __call__(self, *args, **kwargs):
obj=self.__new__(self)
self.__init__(obj, *args, **kwargs)
return obj
class Foo:
__metaclass__=Mytype
def __init__(self,name,age):
self.name=name
self.age=age
def __new__(cls, *args, **kwargs):
return object.__new__(cls)
obj=Foo("xiaoming",18)
print(obj.name,obj.age)
执行结果:xiaoming 18