python 是完全面向对象,一切皆对象。那么对象怎么使用呢?
定义类
类是抽象的模板,对象是类的实例;python也是用class定义类
#定义类(无实现时后跟pass)
class A:pass
#初始化实例(构造函数无参数)
A()
#定义有参数构造函数
class A:
def __init__(self,name,age):
self.name = name
self.age = age
def print_info(self):
print("name:%s,age:%s" % (self.name,self.age))
def __private_m(self):
print('private_method call')
def call_private(self):
print('can only call inside class')
self.__private_m()
A('wang',30).print_info()
A('me',12).call_private()
#第一个参数为self标明为 实例方法,实例方法调用时 直接忽略第一个参数,使用与ruby类似
# 双下划线开头的方法,变量,是私有的,只能在类内访问
继承
python 支持多继承
class B(A):pass
B('wang',30).print_info()
isinstance(B('s',4),A) #返回True,B的实例也算A的实例
#B继承了A的方法和属性
class C(A,B,C):pass #多继承
属性
如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list,比如,获得一个str对象的所有属性和方法:
image.png
hasattr 方法判断对象有没有指定属性,类似ruby的respond_to?
这么用:
a = A('wang',20)
hasattr(a,'name') #返回True
setattr设置对象的属性:
setattr(a,'name','peter')
print(a.name) #peter
getattr获取对象属性
getattr(a,'name')
#如果试图获取不存在的属性,会抛出AttributeError的错误,可以传入一个default参数,如果属性不存在,就返回默认值
getattr(a,'b')
getattr(a,'b','c')
由于Python是动态语言,根据类创建的实例可以任意绑定属性。
给实例绑定属性的方法是通过实例变量,或者通过self变量:
a.address = 'bj'
class C:
name = 'c class'
print(C.name) #c class
动态添加方法
class A:pass
def say_sth(self,who):
print("%s:say hello~" % who)
A.say_sth = say_sth
A().say_sth('me')
使用slots限制只能添加特定属性
class A:
__slots__ = ['name','age']
a = A()
a.name = 'wang'
a.address = 'bj' #Error
使用 @property 定义方法型属性
class A:
@property
def name(self): #get方法
return self.__name
@name.setter
def name(self,name):#set方法
self.__name = name
a = A()
a.name = 'wang'
a.name #wang
网友评论