属性和方法
class PyClass:
... lesson = 'python'
... def init(self, name):
... self.name = name
...
PyClass.lesson
'python'
lesson 被称作类属性也叫做静态属性,可以通过类名调用
PyClass.book = 'learn python'
dir(PyClass)
['class', 'delattr', 'dict', 'dir', 'doc', 'eq', 'format', 'ge', 'getattribute', 'gt', 'hash', 'init', 'init_subclass', 'le', 'lt', 'module', 'ne', 'new', 'reduce', 'reduce_ex', 'repr', 'setattr', 'sizeof', 'str', 'subclasshook', 'weakref', 'book', 'lesson']
类属性可以被创建
name 被称作实例属性
p = PyClass('su')
dir(p)
['class', 'delattr', 'dict', 'dir', 'doc', 'eq', 'format', 'ge', 'getattribute', 'gt', 'hash', 'init', 'init_subclass', 'le', 'lt', 'module', 'ne', 'new', 'reduce', 'reduce_ex', 'repr', 'setattr', 'sizeof', 'str', 'subclasshook', 'weakref', 'book', 'lesson', 'name']
修改实例属性不会影响类属性,也不会影响其他实例的同名属性的值
p.book = 'learn java'
p.book
'learn java'
del p.book
p.book
'learn python'
del p.book
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: book
del PyClass.book
del p.book
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: book
方法
方法和函数
相同
- 使用关键词def
- 使用return语句(除init方法除外)
不同
- 方法必须写在类中
- 方法的第一个参数必须是self
参数self引用了实例
class Foo:
... def method(self, x):
... return x**2
...
f = Foo()
f.method(2)
4
Foo.method(f,3)
9
Foo.method(3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: method() missing 1 required positional argument: 'x'
实例调用方法时默认隐式传入了实例对象作为第一个参数
类对象调用方法时,需传入第一个实例对象参数