-
Python的除法可以分为地板除(你没看错,就是地板)和普通除法,地板除的特殊方法是__floordiv__,普通除法是__truediv__。
地板除法和普通除法不一样,地板除法的结果只会向下取整数。查看全部 -
__str__()函数似乎没有在自定义类Person中生效,这是为什么呢?
这是因为 Python 定义了__str()__和__repr__()两种方法,__str()__用于显示给用户,而__repr__()用于显示给开发人员,当使用str()时,实际调用的是__str__()方法,而直接输入变量,调用的是__repr__()方法。查看全部 -
通过type()函数,可以获得变量的类型。
n = 1 s = 'this is a string' type(n) # ==> <class 'int'> type(s) # ==> <class 'str'>
通过dir()方法,可以获取变量的所有属性:
>>> n = 1 >>> dir(n) ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', ...] >>> s = 'this is a string' >>> dir(s) ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', ...]
在dir列出的属性中,有很多是以下划线开头和结尾的,这些都是特殊的方法,称为内建方法,在后面,我们还会学习这些方法。
dir()返回的属性是字符串列表,如果已知一个属性名称,要获取或者设置对象的属性,就需要用 getattr() 和 setattr( )函数了。
>>> getattr(p, 'name') # 获取name属性 'Alice' >>> setattr(p, 'name', 'Adam') # 设置新的name属性 >>> s.name 'Adam'
查看全部 -
这时有必要去判断数据的类型,通过函数isinstance()可以判断一个变量的类型。
class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender class Student(Person): def __init__(self, name, gender, score): super(Student, self).__init__(name, gender) self.score = score class Teacher(Person): def __init__(self, name, gender, course): super(Teacher, self).__init__(name, gender) self.course = course p = Person('Tim', 'Male') s = Student('Bob', 'Male', 88) t = Teacher('Alice', 'Female', 'English')
当我们拿到变量 p、s、t 时,可以使用 isinstance 判断类型:
>>> isinstance(p, Person) True # p是Person类型 >>> isinstance(p, Student) False # p不是Student类型 >>> isinstance(p, Teacher) False # p不是Teacher类型
这说明在继承链上,一个父类的实例不能是子类类型,因为子类比父类多了一些属性和方法。
s 是Student类型,不是Teacher类型,这很容易理解。但是,s 也是Person类型,因为Student继承自Person,虽然它比Person多了一些属性和方法,但是,把 s 看成Person的实例也是可以的。
isinstance也可以用于Python自有数据类型的判断。
s = 'this is a string.' n = 10 isinstance(s, int) # ==> False isinstance(n, str) # ==> False
查看全部 -
在定义Student类的时候,由于继承了Person类,所以Student类自动拥有name、gender属性,因此,在定义Student类的时候,只需要把额外的属性加上即可。
class Student(Person): def __init__(self, name, gender, score): super(Student, self).__init__(name, gender) self.score = score student = Student('Alice', 'girl', 100) print(student.name) # ==> Alice print(student.gender) # ==> girl print(student.score) # ==> 100
在定义继承类的时候,有几点是需要注意的:
class Student()定义的时候,需要在括号内写明继承的类Person
在__init__()方法,需要调用super(Student, self).__init__(name, gender),来初始化从父类继承过来的属性
查看全部 -
在class中定义的全部是实例方法,实例方法第一个参数 self 是实例本身。
要在class中定义类方法,需要这么写:class Animal(object): __localtion = 'Asia' def __init__(self, name, age): self.name = name self.age = age @classmethod def set_localtion(cls, localtion): cls.__localtion = localtion @classmethod def get_localtion(cls): return cls.__localtion print(Animal.get_localtion()) # ==> Asia Animal.set_localtion('Afica') print(Animal.get_localtion()) # ==> Africa
和实例方法不同的是,这里有两点需要特别注意:
类方法需要使用@classmethod来标记为类方法,否则定义的还是实例方法
类方法的第一个参数将传入类本身,通常将参数名命名为 cls,上面的 cls.__localtion 实际上相当于Animal.__localtion。
因为是在类上调用,而非实例上调用,因此类方法无法获得任何实例变量,只能获得类的引用。
查看全部 -
私有属性没有办法从外部访问,只能在类的内部操作;那如果外部需要操作私有属性怎么办?这个时候可以通过定义类或者实例的方法来操作私有属性.
class Person(object): def __init__(self, name): self.__name = name def get_name(self): return self.__name
name是实例的私有属性,从外部是无法访问的,而get_name(self) 就是一个实例方法,在实例方法里面是可以操作私有属性的,注意,它的第一个参数是self。
另外,__init__(self, name)其实也可看做是一个特殊的实例方法。
通过定义get_name(self)方法,在外部就可以通过这个方法访问私有属性了。p = Person('Alice') print(p.get_name()) # ==> Alice
查看全部 -
通过input()函数,输入的是字符串,需要转型为数字类型。
查看全部 -
Python的sys.path返回的是一个路径列表,因此可以操作列表里面的元素,请通过sys.path增加路径'../',使得在运行时,可以导入当前目录上级目录的包。
import sys sys.path.append('../')
查看全部 -
Python使用import语句导入一个模块
如果希望导入模块的指定部分属性或函数,那么使用from...import...语句
如果希望导入模块里面的所有内容,那么使用from ...import *语句。
如果从一个模块导入函数,有可能会遇到导入的函数与本文件的函数冲突的情况。例如:本文件定义了一个pow()函数,同时从math模块也导入了一个pow()函数,这种情况下就会引起冲突;事实上,这种冲突的情况经常发生。
有两种方法可以解决这个问题,第一种是直接导入模块,不指定导入模块里面的具体内容;第二种方法就是使用from ... import as ...语句,as类似重命名,可以把导入的函数或属性重命名为别的名字。查看全部 -
在Python中,函数其实是一个对象,我们可以将一个函数赋值给一个变量,而不改变函数的功能。
如果把一个类实例也变成一个可调用对象,可以实现一个特殊的方法__call__()。
查看全部 -
由于Python是动态语言,任何实例在运行期都可以动态地添加属性。
如果要限制添加的属性,就可以利用Python的一个特殊的__slots__来实现。
__slots__的目的是限制当前类所能拥有的属性,避免因为外部属性的操作导致类属性越来越难以管理。
查看全部 -
如果一个类表现得像一个list,想使用len()函数来获取元素个数时,则需要实现__len__()方法。
查看全部 -
Python 定义了__str()__和__repr__()两种方法,__str()__用于显示给用户,而__repr__()用于显示给开发人员,当使用str()时,实际调用的是__str__()方法,而直接输入变量,调用的是__repr__()方法。
查看全部 -
类的特殊方法:
1. 双下划线开头2.双下划线结束
3.每个Python对象都拥有特殊方法
查看全部
举报