python基础学习2(面向对象)


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