最近在复习一下Python的基础知识,发现还是有一些语法点并没有记住,这里记录一下,同时给大家分享一下。
dir函数(查看一个对象的所有属性和方法)
听过dir函数,我们可以看到所有对象的属性和方法,了解到一些对象所具有的个别方法。
__类变量名(隐藏变量)
Python中虽然没有机制限制我们能够像Java那样私有化一个成员变量,但是它提供了一个特殊的机制来帮助我们有效减少错误,“间接”实现了私有化。这里我们举出一个例子:
class Person(object):
def __init__(self,name,age):
self.__name = name
self.__age = age
def get_name(self):
return self.__name
def get_age(self):
return self.__age
上面的例子中,我们这里将类的变量定义为__name和__age(前面有2个下划线),一旦将成员变量定义为这种形式的话,我们就在类外部就不能直接通过变量名来访问:
if __name__ == '__main__':
a = Student('Tom', 24)
b = Student('Jack', 25)
a.__name = 'Jerry' # 会报错,提示我们 a 没有这个属性
上面的代码提示我们无法找到__name变量,但是这样会提示我们找不到属性,这个有效避免了我们随意修改变量。
但是前面说到,Python并没有限制我们进行修改变量,实际上它把__name变量和__age变量改成了_Person_name变量,我们依然通过后者的变量名来进行修改。
@property
这个语法之前也用到过,但是这次回顾一下,这个语法允许我们将一个函数当作一个属性来用(这里是我个人理解,不对请纠正),同时也可以设置(设置的时候可以在函数内部检查变量的值的合法性),这边给出一个例子:
class Test(object):
def __init__(self, x = 1):
self.x = x
@property
def count(self):
return self.x
@count.setter
def count(self, x):
if x > 10:
self.x = x
上面的代码中,我们可以看到整个我们对count函数设置了 property属性,我们就可以直接将整个函数当作属性来行,同时在进行属性赋值的时候,我们还可以进行对输入的参数进行检查。
if __name == '__main__':
pass
__slots __(限制对象的属性)
这个__slots__是用来限制对象的属性的(但是这个属性仅仅对本类起作用,对子类是不起作用的(除非在子类中也定义了__slots__,子类如果定义了__slots__那么子类中的成员也就是父类+该子类的)),这是一个特殊的变量,不要将自己定义的变量定义成这个样子,下面给出一个示例:
class Test(object):
__slots__ = ('_age', '_name')
def __init__(self, age, name):
self._age = age
self._name = name
@property
def age(self):
return self._age
@property
def name(self):
return self._name
@age.setter
def age(self, age):
# 这个设置值的函数名必须 age (亲测,如果写成其他的名字会报错)
self._age = age
@name.setter
def name(self, name):
# 这个函数的名字也必须是 name,原因同上
self._name = name
上面的程序中,我们看到了我们使用__slots__来限制了类成员变量的变量名,并且我们使用了之前说的@property来设置一些属性,下面可以给出一个示例:
if __name__ == '__main__':
a = Test(23, 'Jerry')
print(a.name)
a.name = 'Tom'
print(a.name)
a.address = 'beijing' # 这个语句会报错 会提示我们: 'XXX has no attrubute address'
给类或者类实例动态添加方法
我们经常看到的是给类的实例动态添加属性,但是给类的实例动态添加方法,我之前并没有怎么用到,这个可以正好复习一下,示例如下:
class Book(object):
def __init__(self, name, pages):
self.name = name
self.pages = pages
上面是类的定义,下面我们给出一个运行示例:
from types import MethodType
def read(self):
self.pages -= 1
if __name__ == '__main__':
book = Book('travel', 456)
book.read_book = read
book.read_book() # 这个会报错 提示我们:“read() missing 1 required positional argument: “self”
book.new_read_book = MethodType(read, book)
print(book.pages) # 456
book.new_read_book() # 这里可以正常调用
print(book.pages) # 455
上面的代码,给类的实例变量动态添加方法需要不能直接像添加成员变量一样直接赋值,需要用到MethodType来辅助,但是注意到对类添加方法并不需要Methodtype,示例:
def read(self):
self.pages -= 1
if __name__ == '__main__':
Book.read_book = read
book = Book('travel', 456)
book.read_book()
print(book.pages) # 455
这里我们看到给类添加一个方法比较简单,直接可以像添加属性一样进行添加,便于扩充类的方法。
这里就先写这么多吧,未完待续…