python常用语法知识点

  最近在复习一下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

  这里我们看到给类添加一个方法比较简单,直接可以像添加属性一样进行添加,便于扩充类的方法。

  这里就先写这么多吧,未完待续…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值