python中调用方法时加括号与不加括号的区别
def cal(data):
return data + data
if __name__ == '__main__':
print(cal(5))
print(cal)
-
不带括号时,调用的是这个函数本身 ,是整个函数体,是一个函数对象,不须等该函数执行完成,返回对象地址
-
带括号(参数或者无参),调用的是函数的执行结果,须等该函数执行完成的结果,返回函数执行结果
@classmethod:类方法
由类调用,最少要有一个参数cls,调用的时候这个参数不用传值,这个参数表示这个类自身,可以来调用类的属性、方法、实例化对象等
class Provice(object):
country = '中国'
def __init__(self, name, age):
self.name = name
self.age = age
def func1(self):
print(self.name)
@classmethod
def show(cls):
print(cls.country)
cls('zja', 12).func1()
Provice.show()
end 关键字
关键字end可以用于将结果输出到同一行,或者在输出的末尾添加不同的字符
# coding: utf-8
# 斐波纳契数列
a, b = 0, 1
while b < 1000:
print(b, end=',')
a, b = b, a+b
@log
装饰器,在代码运行期间动态增加功能
# coding: utf-8
def log(func):
def wrappaer(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrappaer
# 装饰器
@log
def now(): #相当于执行了now = log(now)
print('2018-08-22')
now()
类的继承
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
class Animal(object):
def run(self):
print('Animal is runnine')
class Dog(Animal):
def run(self):
print('Dog is running')
class Cat(Animal):
def run(self):
print('Cat is running')
class Duck(Animal):
def run(self):
print('Duck is running slowly')
def run_twice(animal):
animal.run()
animal.run()
dog = Dog()
dog.run()
cat = Cat()
cat.run()
b = Animal()
print(isinstance(b, Dog))
print(isinstance(cat, Cat))
run_twice(Animal())
run_twice(Dog())
run_twice(Duck())
类属性设置
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
class Student(object):
# __slots__ = ('name', 'age') # 限制Student 实例的属性,只允许添加或修改name,age属性,仅对当前实例起作用,对继承的子类是不起作用的
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
def print_score(self):
print('%s: %s' % (self.name, self.score))
# 实例调用的属性找不到的情况下 在 __getattr__中查找
def __getattr__(self, item):
if item == 'teacher':
return '王王'
raise AttributeError('\'Student\' object has no attribute \'%s\'' % item)
bart = Student('lll', 18, 60.4)
print(bart.name)
bart.print_score()
print(bart.teacher)
# print(bart.asc)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from types import MethodType
class Course(object):
def __init__(self, cnmae, ctime):
self.__cname = cnmae
self.__ctime = ctime
def print_score(self):
print('%s: %s' % (self.__cname, self.__ctime))
def get_name(self):
return self.__cname
def set_name(self, name):
if len(name) > 0:
self.__cname = name
else:
self.__cname = '大大'
def set_age(self, age):
self.age = age
course = Course('英语课', 2)
# 给实例绑定方法 给一个实例绑定方法 对另一个实例不起作用
course.set_age = MethodType(set_age, course)
course.set_age(25) # 调用实例方法
print('给实例绑定方法 %s' % (course.age)) # 测试结果
# 给class方法绑定方法
Course.set_age = set_age
course.set_age(100)
print('给class方法绑定方法 %s' % (course.age))
# 类属性前加上'__'之后,变为私有变量,只有内部可以访问
# print(course.__cname)
print(course.get_name())
course.print_score()
course.set_name('数学课')
print(course.get_name())
定制类
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
class Student(object):
def __init__(self, name):
self.name = name
# 用于定制类
def __str__(self):
return 'Student object (name: %s)' % self.name
__repr__ = __str__
# 未使用定制 <__main__.Student object at 0x01335C50>
# 定制之后的输出:Student object (name: XXX)
print(Student('XXX'))
class Chain(object):
def __init__(self, path=''):
self._path = path
def __getattr__(self, path): # 找不到类属性,执行此函数
return Chain('%s/%s' % (self._path, path))
def __call__(self): # 直接对实例进行调用
print('My path is %s' % self._path)
def __str__(self): # 定制类。输出时调用此接口
return 'aaa\'s path is: %s' % self._path
__repr = __str__
print(Chain().status.user.timeline.list)
枚举
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from enum import Enum, unique
class Student(object):
def __init__(self, name):
self.name = name
# 定义 __call__()方法 直接对实例进行调用
def __call__(self):
print('My name is %s' % self.name)
s = Student('Michael')
s()
# 枚举类
Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', ))
# __members__,它包含了枚举类中的所有成员 一般情况下用于枚举类中有重复值的成员
for name, member in Month.__members__.items():
print(name, '=>', member, ',', member.value)
for data in Month:
print(data.name, '=>', data, ',', data.value)