-
class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender def __str__(self): return '(Person: %s, %s)' % (self.name, self.gender)
>>> p = Person('Bob', 'male') >>> print p (Person: Bob, male)
如果要把一个类的实例变成 str,就需要实现特殊方法__str__()
查看全部 -
如果一个属性以"__xxx__"的形式定义,那它又可以被外部访问了,以"__xxx__"定义的属性在Python的类中被称为特殊属性,有很多预定义的特殊属性可以使用,通常我们不要把普通属性用"__xxx__"定义。以单下划线开头的属性"_xxx"虽然也可以被外部访问,但是,按照习惯,他们不应该被外部访问。
查看全部 -
for k,v in kw.iteritems():
setattr(self,k,v)
**kw,本质是个dict对象,for in 通过dict的iteritems迭代器循环中会读取出key 和 value ,key是dict的key,value则是对应值。这样获取的属性设置只能通过setattr,因为你要设置的是属性的名称,而直接self.k的方式设置的属性为k,而且不是k的内容。
查看全部 -
有没有别的方法获取到变量更多的信息呢?
首先可以用 type() 函数获取变量的类型,它返回一个 Type 对象。
其次,可以用 dir() 函数获取变量的所有属性。dir()返回的属性是字符串列表,如果已知一个属性名称,要获取或者设置对象的属性,就需要用 getattr() 和 setattr( )函数了。
查看全部 -
除了从一个父类继承外,Python允许从多个父类继承,称为多重继承。
查看全部 -
多态:如果我们从 Person 派生出 Student和Teacher ,并都写了一个 whoAmI() 方法,如果我们接收一个变量 x,则无论该 x 是 Person、Student还是 Teacher,都可以正确打印出结果.
s 是Student类型,它实际上拥有自己的 whoAmI()方法以及从 Person继承的 whoAmI方法,但调用 s.whoAmI()总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止。
查看全部 -
函数isinstance()可以判断一个变量的类型,既可以用在Python内置的数据类型如str、list、dict,也可以用在我们自定义的类,它们本质上都是数据类型。在继承链上,一个父类的实例不能是子类类型,因为子类比父类多了一些属性和方法。一个实例可以看成它本身的类型,也可以看成它父类的类型。
查看全部 -
如果已经定义了Person类,需要定义新的Student和Teacher类时,可以直接从Person类继承:
class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender
定义Student类时,只需要把额外的属性加上,例如score:
class Student(Person): def __init__(self, name, gender, score): super(Student, self).__init__(name, gender) self.score = score
查看全部 -
在class中定义的实例方法第一个参数 self 是实例本身。
要在class中定义类方法,需要这么写:
class Person(object): count = 0 @classmethod def how_many(cls): return cls.count def __init__(self, name): self.name = name Person.count = Person.count + 1 print Person.how_many() p1 = Person('Bob') print Person.how_many()
通过标记一个 @classmethod,该方法将绑定到 Person 类上,而非类的实例。类方法的第一个参数将传入类本身,通常将参数名命名为 cls,上面的 cls.count 实际上相当于 Person.count。
查看全部 -
因为方法也是一个属性,所以,它也可以动态地添加到实例上,只是需要用 types.MethodType() 把一个函数变为一个方法:
import types def fn_get_grade(self): if self.score >= 80: return 'A' if self.score >= 60: return 'B' return 'C'
class Person(object): def __init__(self, name, score): self.name = name self.score = score p1 = Person('Bob', 90)
p1.get_grade = types.MethodType(fn_get_grade, p1, Person) print p1.get_grade() # => A p2 = Person('Alice', 65) print p2.get_grade() # ERROR:
查看全部 -
实例的方法就是在类中定义的函数
class Person(object): def __init__(self, name): self.__name = name def get_name(self): return self.__name
get_name(self) 就是一个实例方法,它的第一个参数是self。__init__(self, name)其实也可看做是一个特殊的实例方法.调用实例方法必须在实例上调用:
p1 = Person('Bob') print p1.get_name() # self不需要显式传入 # => Bob
查看全部 -
当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问.
查看全部 -
类是模板,而实例则是根据类创建的对象。实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。
class Person(object): address = 'Earth' def __init__(self, name): self.name = name print Person.address # => Earth p1 = Person('Bob') p2 = Person('Alice') print p1.address # => Earth print p2.address # => Earth
查看全部 -
类是模板,而实例则是根据类创建的对象。实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。
class Person(object): address = 'Earth' print Person.address # => Earth p1 = Person('Bob') p2 = Person('Alice') print p1.address # => Earth print p2.address # => Earth
查看全部 -
如果一个属性由双下划线开头(__),该属性就无法被外部访问。如果一个属性以"__xxx__"的形式定义,那它又可以被外部访问了,以"__xxx__"定义的属性在Python的类中被称为特殊属性,有很多预定义的特殊属性可以使用.
class Person(object): def __init__(self, name): self.name = name self._title = 'Mr' self.__job = 'Student' p = Person('Bob') print p.name # => Bob print p._title # => Mr print p.__job # => Error Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'Person' object has no attribute '__job'
查看全部
举报